複数のPhpStormのプロジェクトをMacのターミナルから開く

PhpStorm。多機能すぎて全然使いこなせてないけど、今日2017.1.2にアップデートした。(2016年12月でライセンス切れてた…)

複数のプロジェクトをターミナルから開けない

あんまり一度に複数のプロジェクトを開くことはないんだけど、以前は、プロジェクトのルートディレクトリで

phpstorm .

で複数開けてたんだけど、できなくなった。
もちろん、System Settings > Project Openingの設定は、Open project in new windowにしてある。

Tool > Create Command-line Launcher…で作り直した

これで直った。
phpstormで作ってたんだけど、今回は pstormで 😅
特に理由はないけど。
/usr/lobal/bin/xxxxx(決めた名前)にスクリプトが作られる。

中身はこれ↓↓

# open phpstorm from current directory
export PATH=$PATH:/usr/local/bin/pstorm

でsource ~/.bash_profileで無事複数開けるようになった 😀💡
場所は、/usr/local/bin/pstorm
中身は、

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import struct
import sys
import os
import time

# see com.intellij.idea.SocketLock for the server side of this interface

RUN_PATH = u'/Applications/PhpStorm.app'
CONFIG_PATH = u'/Users/oredayo/Library/Preferences/PhpStorm2017.1'
SYSTEM_PATH = u'/Users/oredayo/Library/Caches/PhpStorm2017.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

    with open(port_path) as pf:
        port = int(pf.read())
    with open(token_path) as tf:
        token = tf.read()

    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)
            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)
        encoded = struct.pack('>h', len(cmd)) + cmd
        s.send(encoded)
        time.sleep(0.5)  # don't close the socket immediately
        return True

    return False


def start_new_instance(args):
    if sys.platform == 'darwin':
        if len(args) > 0:
            args.insert(0, '--args')
        os.execvp('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)

作り直す前がこれ↓↓

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import struct
import sys
import os
import time

# see com.intellij.idea.SocketLock for the server side of this interface

RUN_PATH = u'/Applications/PhpStorm.app'
CONFIG_PATH = u'/Users/oredayo/Library/Preferences/PhpStorm2016.3'
SYSTEM_PATH = u'/Users/oredayo/Library/Caches/PhpStorm2016.3'


def print_usage(cmd):
    print(('Usage:\n' +
           '  {0} -h | -? | --help\n' +
           '  {0} [-l|--line line] 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 arg == 'diff' and i == 0:
            args.append(arg)
        elif arg == 'merge' and i == 0:
            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:
            if ':' in arg:
                file_path, line_number = arg.rsplit(':', 1)
                if line_number.isdigit():
                    args.append('-l')
                    args.append(line_number)
                    args.append(os.path.abspath(file_path))
                else:
                    args.append(os.path.abspath(arg))
            else:
                args.append(os.path.abspath(arg))

    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

    with open(port_path) as pf, open(token_path) as tf:
        port = int(pf.read())
        token = tf.read()

    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)
            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)
        encoded = struct.pack('>h', len(cmd)) + cmd
        s.send(encoded)
        time.sleep(0.5)  # don't close the socket immediately
        return True

    return False


def start_new_instance(args):
    if sys.platform == 'darwin':
        if len(args) > 0:
            args.insert(0, '--args')
        os.execvp('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)

【PhpStormメモ】

昨年の秋辺りからメインとして使い始めたPhpStorm。

より。
素のままでも大変便利なPhpStorm。言い換えると素のまましか知らない…(^0^;)

ブックマーク使ってみた

Navigate > Bookmarks

スクリーンショット 2016-01-17 13.57.38

これ。ファイルの任意の位置をブックマークして、シャッとジャンプできるやつです。
エディタを分割しててもなんだか使いづらくて、今まで使うのも面倒だからという理由で使っていなかったんですが、かなり便利ですね…もっと早く使えよって話です、ええ。。

ブックマークに番号(記号)振ってcontrol + 番号(記号)でも飛べるみたいですが、番号は覚えていられないかもなぁということで、Next Bookmark, Previous Bookmarkにショートカットを振って、ブックマークを行ったり来たりしてみることにしました。

これだけでも、相当便利ですね 🙂
(今まで使っていたCodaやSublime Textとかでも一切使ったことない前提です ^^;)

相当多機能なPhpStorm。使いこなすには時間かかりそうですが、先ずは便利だな!! と感じる機能からちょっとずつ使ってみたいと思います。

vimメモ

行を削除する

  • dd

複数行削除

複数行をまるっと削除できて便利。ms, meは入力しても画面に変化がないのでわかりづらいけど…

  • 開始行で“ms”
  • 終了行で“me”
  • :’s,’ed でEnter(s → start, e → end,  d(delete)なのかなぁ…)
  • ペースとしたい場所で p

コピー

  • y

複数行のコピー(コピペ)

選択方法はms, meと同じ

  • 開始行で“ms”
  • 終了行で“me”
  • :’s,’ey でEnter(s → start, e → end,  y(ヤンク)なのかなぁ…)

ビジュアルモード

v

入力モード

  • i :カーソルの前
  • a:カーソルの後ろ

ディレクトリ作成

  • mkdir
  • -pオプション: まとめて作成。
    mkdir -p /image/nav/ (imageディレクトリがない場合でもOK)

ファイルパーミッション

  • r 読み 4
  • w 書き 2
  • x 実行 1

※ディレクトリの場合のxは実行ではなくてディレクトリの中のファイルにアクセスできるという意味。 *
※所有者、グルーブ、その他のユーザーの順*

デーモン(daemon)類

  • service httpd (restartなど)

ディレクトリ配下全てのファイルオーナーを変更する

sudo chown nginx:nginx plugins/*

Sublime Text 2 メモ (思いつき更新中)

Show Console

^ + ~ (control + チルダ )ってなってるけど、日本語キーボードでは、

^ + Shift + @

Package Controlのコードを入力する時など。

install

Package Control からインストールする時、⌘ + Shift + P から直で install とタイプしてOK。
取りあえず、Emmetをインストールしてみた。

  1. ⌘ + Shift + P
  2. install
  3. emmet
  4. enter

restart editor と出るので再起動。展開は Tab キーになってた。

grep (サイト内検索・置換)

⌘ + Shift + F (検索キーワード)

コレやると、Project内該当ファイルを「Find Result」ウィンドウでリストアップしてくれる。続けて検索すると、同じウィンドウ内(Find Result)に書き出される。該当キーワードがハイライトされていて、クリックすると、当該ファイルを開いて行をハイライトしてくれる。Codaでいうサイト内検索と同じだと (^^)。コレばっかり使ってたから、あると助かる!!