更新
现在可以从JetBrains Toolbox自动创建命令行启动器。以下是操作步骤:
- 打开Toolbox窗口;
- 进入右上角的齿轮图标(Toolbox本身的设置窗口);
- 打开
生成shell脚本
;
- 将
Shell脚本位置
文本框中填写您想要启动器存放的位置。目前必须手动填写,不会自动填充!
在Mac上,位置可能是/usr/local/bin
。对于新手,您可以使用PATH变量内的任何路径或在bash配置文件中添加新路径到PATH变量。使用echo $PATH
查看有哪些路径。
注意!对我而言,它并没有立即起作用,我需要稍微调整一下才能生成脚本。您可以转到IDEA(例如PyCharm)的齿轮图标以查看/更改启动器名称。因此,对于PyCharm,默认名称为pycharm
,但您可以将其更改为任何您喜欢的名称。
原始回答
如果您不使用Toolbox,仍然可以使用我的原始回答。
~~由于现在已成为JetBrains Toolbox的一部分,因此在2019.1中不再提供创建命令行启动器
选项。~~
以下是您自己创建脚本的方法:
如果您之前已经使用过charm命令,请使用
type -a charm
查找脚本。更改文件路径中的pycharm版本。请注意,第一个变量
RUN_PATH
中的编号是不同的。您需要自己在目录中查找。
RUN_PATH = u'/Users/boatfolder/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/191.6183.50/PyCharm.app'
CONFIG_PATH = u'/Users/boatfolder/Library/Preferences/PyCharm2019.1'
SYSTEM_PATH = u'/Users/boatfolder/Library/Caches/PyCharm2019.1'
如果您以前没有使用过charm命令,则需要创建它。
将charm文件创建在类似这样的位置:/usr/local/bin/charm
然后添加此代码(根据上面的说明更改版本号):
import socket
import struct
import sys
import os
import time
RUN_PATH = u'/Users/boatfolder/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/191.6183.50/PyCharm.app'
CONFIG_PATH = u'/Users/boatfolder/Library/Preferences/PyCharm2019.1'
SYSTEM_PATH = u'/Users/boatfolder/Library/Caches/PyCharm2019.1'
def print_usage(cmd):
print(('Usage:\n' +
' {0} -h | -? | --help\n' +
' {0} [project_dir]\n' +
' {0} [-l|--line line] [project_dir|--temp-project] file[:line]\n' +
' {0} diff <left> <right>\n' +
' {0} merge <local> <remote> [base] <merged>').format(cmd))
def process_args(argv):
args = []
skip_next = False
for i, arg in enumerate(argv[1:]):
if arg == '-h' or arg == '-?' or arg == '--help':
print_usage(argv[0])
exit(0)
elif i == 0 and (arg == 'diff' or arg == 'merge' or arg == '--temp-project'):
args.append(arg)
elif arg == '-l' or arg == '--line':
args.append(arg)
skip_next = True
elif skip_next:
args.append(arg)
skip_next = False
else:
path = arg
if ':' in arg:
file_path, line_number = arg.rsplit(':', 1)
if line_number.isdigit():
args.append('-l')
args.append(line_number)
path = file_path
args.append(os.path.abspath(path))
return args
def try_activate_instance(args):
port_path = os.path.join(CONFIG_PATH, 'port')
token_path = os.path.join(SYSTEM_PATH, 'token')
if not (os.path.exists(port_path) and os.path.exists(token_path)):
return False
try:
with open(port_path) as pf:
port = int(pf.read())
with open(token_path) as tf:
token = tf.read()
except (ValueError):
return False
s = socket.socket()
s.settimeout(0.3)
try:
s.connect(('127.0.0.1', port))
except (socket.error, IOError):
return False
found = False
while True:
try:
path_len = struct.unpack('>h', s.recv(2))[0]
path = s.recv(path_len).decode('utf-8')
if os.path.abspath(path) == os.path.abspath(CONFIG_PATH):
found = True
break
except (socket.error, IOError):
return False
if found:
cmd = 'activate ' + token + '\0' + os.getcwd() + '\0' + '\0'.join(args)
if sys.version_info.major >= 3: cmd = cmd.encode('utf-8')
encoded = struct.pack('>h', len(cmd)) + cmd
s.send(encoded)
time.sleep(0.5)
return True
return False
def start_new_instance(args):
if sys.platform == 'darwin':
if len(args) > 0:
args.insert(0, '--args')
os.execvp('/usr/bin/open', ['-a', RUN_PATH] + args)
else:
bin_file = os.path.split(RUN_PATH)[1]
os.execv(RUN_PATH, [bin_file] + args)
ide_args = process_args(sys.argv)
if not try_activate_instance(ide_args):
start_new_instance(ide_args)