2017-05-18 17 views
1

私はUbuntu 16.04を使用しています。私はSublime Text 3を使用し、C++プログラムをコンパイルして端末で実行することができます。 以下はスクリプトです。Sublime Text 3 - 端末にC++プログラム(パスにスペースが含まれています)をコンパイルして実行します。

{ 
    "cmd": ["g++", "$file", "-o", "${file_path}/${file_base_name}"], 
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", 
    "working_dir": "${file_path}", 
    "selector": "source.c, source.c++, source.cxx, source.cpp", 
    "variants": 
    [ 
     { 
      "name": "RunInShell", 
      "shell": true, 
      "cmd": ["gnome-terminal -e 'bash -c \"${file_path}/${file_base_name};echo; echo Press ENTER to continue; read line;exit; exec bash\"'"] 
     } 
    ]  
} 

しかし、Cのパスが++プログラムは、スペース(のような/algorithms/Search in Rotated Sorted Array)が含まれ、スクリプトが動作しません!

bash: /media/algorithms/Search: No such file or directoryは、RunInShellを使用しているときに端末に表示されます。

スクリプトを修正しようとしています(一重引用符を挿入するなど)。

"cmd": ["gnome-terminal -e 'bash -c \"'${file_path}/${file_base_name}';echo; echo Press ENTER to continue; read line;exit; exec bash\"'"]

しかし、それは動作しません。

私はスクリプトをうまく機能させるように修正する方法を知りました。

+0

おそらく、 '$ {file_path}/$ {file_base_name}'の部分を引用する必要があります。 –

+0

あなたの考えは正しいですが、この部分の周りの追加引用符は正面引用符と一致しています。したがって、動作しません。 – luckcul

答えて

3

If we look at the documentation on Build Systems, we see that we can use snippet substitution in the variables used in the build system.

したがって、我々はescape each space to a backslash and a space, for use in Bashができます。上記は、「より多くの私たちが実際に必要以上の変数が、doesnのが含まれていることを

import os.path; file_path = '/algorithms/Search in Rotated Sorted Array'; file_name = os.path.basename(file_path); sublime.expand_variables(r'${file_path/ /\\ /g}/${file_base_name/ /\\ /g}', { 'file_path': os.path.dirname(file_path), 'file': file_path, 'file_name': file_name, 'file_extension': os.path.splitext(file_name)[1], 'file_base_name': os.path.splitext(file_name)[0], 'packages': sublime.packages_path() }) 

注:STの(パイソン)コンソールに次のように入力して、たとえば、最初のビルドシステムの外にそれで遊んでする方が簡単な場合があり実際にはall the variables available from the build systemが含まれていますが、この例では十分であり、さらに実験したい場合は簡単に追加できます。詳しくは、ST API Referenceを確認してください。具体的には、欠落している項目はWindowクラスの一部です。

とにかく、我々はそれから得る出力は次のとおりです。

'/algorithms/Search\\ in\\ Rotated\\ Sorted\\ Array' 

(これはPython文字列なので、2つのスラッシュは単一のスラッシュを表しエスケープコードであることを覚えておいてください。)

ここで見ているのは${file_path/ /\\\\ /g}です。これがSTに伝えていることは、file_path変数の値をとり、それに対して正規表現置換を実行することです。スペースは、リテラルスラッシュとそれに続くスペースで置き換える必要があります。最後の/gはグローバル正規表現修飾子フラグで、最初の一致/置換で停止しないように指示し、すべてのスペースを置き換えるようにします。 - 私がテストするために示したPythonコード内やJSON文字列の両方我々は4つのスラッシュを持って

"cmd": ["gnome-terminal -e 'bash -c \"${file_path/ /\\\\ /g}/${file_base_name/ /\\\\ /g};echo; echo Press ENTER to continue; read line;exit; exec bash\"'"] 

注:ビルドシステムにそれをプラグインする今

、。これは、最初の2つのスラッシュがJSON/Pythonにリテラルスラッシュを使用するように指示するエスケープシーケンスであるためです。その後、同じことをやり直したいので、正規表現パターンではリテラルスラッシュを使用します。

+0

cool!あなたの説明は明らかです。それは変更後もうまく機能します。ありがとう! – luckcul

関連する問題