2017-05-18 3 views
1

나는 우분투 16.04를 사용하고 있습니다. 나는 Sublime Text 3을 사용하며, C++ 프로그램을 컴파일하여 터미널에서 실행할 수 있습니다. 다음은 스크립트입니다.숭고한 텍스트 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는 할 수 있습니다. ST의 (파이썬) 콘솔에서 다음을 입력하여 예를 들어, 첫 번째 빌드 시스템 외부에서 놀러 쉬울 수 있습니다 : 위에서 우리가 실제로 필요한 것보다 많은 변수를 포함

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() }) 

참고하지만, '아무튼 실제로는 all the variables available from the build system을 포함하지만이 예제에서는 충분하며 추가로 실험하고 싶다면 쉽게 추가 할 수 있습니다. 자세한 내용은 ST API Reference을 확인하십시오. 특히 누락 된 항목은 Window 클래스의 일부입니다.

어쨌든, 우리가 그에게서 얻는 출력은 다음과 같습니다

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

(이것은 파이썬 문자열이라는 것을 기억, 그래서 두 개의 슬래시가 단일 슬래시를 나타내는 이스케이프 코드입니다.)

여기에서 우리가 보는 것은 ${file_path/ /\\\\ /g}입니다. 이것이 ST에 알려주는 것은 file_path 변수의 값을 가져 와서 정규 표현식 대체를 실행하는 것입니다. 그것은 공백으로 뒤 따르는 리터럴 슬래시로 공백을 대체해야합니다. 마지막에 /g은 글로벌 정규 표현식 수정 자 플래그로, 첫 번째 일치/대체에서 멈추지 않도록 지시하여 모든 공백을 대체하는지 확인합니다. 이제

는 빌드 시스템에 그 연결하기 : 우리가 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\"'"] 

주 - 내가하고 JSON 문자열을 테스트했다 모두 파이썬 코드를. 이것은 처음 두 개의 슬래시가 JSON/Python에 리터럴 슬래시를 사용하도록 지시하는 이스케이프 시퀀스이기 때문입니다. 그런 다음 regex 패턴이 리터럴 슬래시를 사용하도록 다시 동일한 작업을 수행하려고합니다.

+0

멋지다! 당신의 설명은 분명합니다. 그리고 수정 후 잘 작동합니다. 감사! – luckcul