Tuesday, July 26, 2011

input_panel에 명령어를 넣으면, 타이틀 지정하여 cmd.exe 를 열고, sendkey 하기.

input_panel에 명령어를 넣으면, 타이틀 지정하여 cmd.exe 를 열고, sendkey 하기.

이 기능은 emeditor에서 가장 자주 써먹는 매크로 입니다.
주로 소스파일을 편집하다가 F5를 누르면 cmd창을 띄우고 sendkey로 해당 컴파일명령을 실행합니다.
sendkey로 보내는 내용은 나중에 나오는 확장shebang이라고 부르는 일종의 주석라인을 이용합니다.

cmd.exe실행하기

cmd창을 띄울 때는, 같은 이름으로 cmd창이 뜨면 제대로된 findwindow를 할 수 없습니다.
그래서 이름을 지정하여 cmd창을 띄웁니다.

코드는 다음과 같습니다.

pid = subprocess.Popen(["cmd.exe", "/c", 'start', 'hello ', 'cmd.exe']).pid
이 코드는 import subprocess를 필요로 합니다.또 Popen은 child process종료를 기다리지 않고 진행합니다.
이에 관한 레퍼런스는 이쪽에서 보실 수 있습니다.

또 findwindow & sendkey입니다만,

이 기능은 wscript, 닷넷, perl등등의 각각의 언어에서 제공하는 win32라이브러리 콜을 사용했는데, 이제는 /* 나이가 들어서인지 각 pc마다 모듈을 설치하기도 좀 귀찮아지고 */ 그냥 성능이 약간 떨어지더라도 간단히 로컬실행파일을 spawn해 sendkeys 하는 것으로 구현합니다.
적당한 툴은 http://orlando.mvps.org/SendKeysMore.asp에서 다운받았습니다.
이 툴은, findwindowbyname과 sendkeys를 동시에 하는데 wscript의 sendkeys가 ascii가 아닌 일본어등을 제대로 send해주지 못했던 부분도, 함께 해결하고 있습니다.

C:\temp\SendKeys.exe 0, 0, "無題 - メモ帳" "Hello!~{PAUSE}After of 1s.~{PAUSE 2}After of 3s.~テスト"

과 같은 코드도 잘 실행되더군요.

아직 가다듬은 코드가 아니고, 실행되는 지, 테스트만 한 것이므로, 코드는 생략하고, 이미지로 대신합니다.



아, call함수는 child process종료를 기다리는 함수입니다. 역시 파이선의 매뉴얼 참조...

Monday, July 25, 2011

show_quick_panel() 사용하기

sublime_plugin.WindowCommand.window.show_input_panel()대신,
sublime_plugin.WindowCommand.window.show_quick_panel()을 사용해 보았습니다.



어떻게 생겼는 지, 어디에 쓸 수 있을 지 확인하기 위한 것으로, 특별한 내용은 없습니다만,
input_panel이 열려 있는 동안에는 quick_panel은 activete되지 않도록 설계되어 있는 것 같습니다. 즉, 동시에 둘을 사용할 수는 없는 듯 합니다.

또, quick_panel에서는, enter/up/down 와 몇몇 키는 사용할 수 없는 것 같습니다.

F4를 누르면 현재 명령라인의 파일을 옆 group에서 보여주기

다음은 한번 따라해보세요 의 연결된 포스트입니다.
현재의 라인이

>edit c:\test\test.txt

일 때, F4를 누르면 그 파일을 열어서 보여주는 코드를 썼습니다만,
여기에 덧붙여, group이 복수개 일때, 현재의 group에서 열지 않고, 그 다음 group에서 열어서 보여주는 코드로 작성해 봅니다.
※group이 하나일 때, 점점 증분해서 보여주는 디자인도 생각할 수 있습니다만, 노트북에서는 group을 두개 열어놓고 쓰기도 좁더라구요.




class CrowdyF4Command(sublime_plugin.TextCommand):
def run(self, edit):
for region in self.view.sel():
if region.empty():
curPoint = self.view.line(region)
strLine = self.view.substr(curPoint)
self.__parseCommand(strLine)
else:
lines = self.view.substr(region)

def __parseCommand(self, strLine):
p = re.compile(r"^'?#?>(.+)\s+([^\n]+)?$")
m = p.match(strLine)
if (m):
strCmd = m.group(1)
if strCmd == 'edit':
strParam = getPathChanged(m.group(2))
window = self.view.window()
if window.num_groups() > 1 :
print "window.num_groups() is " + str(window.num_groups())
print "window.active_group() is " + str(window.active_group())
current_group = window.active_group()
print "current_group is " + str(current_group)

next_group = current_group + 1
if next_group > window.num_groups() : next_group = 0
window.focus_group(next_group)

print strParam
window.open_file(strParam)
window.focus_group(current_group)
else:
window.open_file(strParam)

elif strCmd == 'close':
self.view.window().close_file()
else:
print "not defined command : " + strCmd
else:
print "no command : " + strLine


기동시키는데 부족한 나머지 코드들은 한번 따라해보세요 의 포스트에 있습니다.

왼쪽에는 큰 줄거리, 오른쪽에는 세부 줄거리.. 와 같은 구성으로 사용하시면, 소설을 쓰시는 분들에게도 꽤 쓸만한 기능이지 않을까 합니다.

Sunday, July 24, 2011

현재 문서의 Path를 클립보드에 복사하기.

간단하고 단순한 기능이지만, 만들어 놓고 꽤 잘 쓰는 기능들이 있습니다.
예를 들면, 지금과 같이, ex커맨드창에 마침표를 입력하면, 클립보드에 현재 문서의 path를 복사해 주는 기능입니다.
물론 파일열기 메뉴 파일열기 다이얼로그로 부터 현재 문서의 path를 구하는 방법이 있으므로, 굳이 이런 기능이 없어도 구할 수 있습니다.
그런데 있으면 꽤 종종 써먹게 됩니다.

대개 sublime text 2이외에도, 매크로가 지원되는 에디터(vim, emacs, emeditor, ms-word, padre등등)에서도, 대개 각각 필요한 api가 지원되므로 다들 만들 수 있는 기능이기도 합니다.
sublime text 2의 경우라면 다음과 같은 라인이 됩니다.


sublime.set_clipboard(self.window.active_view().file_name())


다른 예를 또 들자면, 현재 라인(또는 Selection)을 복사해 붙이는 기능입니다.
Home,Shift-End,Ctrl-C,Esc[,End],Enter,Ctrl-V
를 하나의 키로 줄이는 기능입니다.

#언제나처럼 api문서는 이쪽 입니다.

Thursday, July 14, 2011

tab size 변경하기

폰트설정도 마찬가지 입니다만, 세팅파일은 다음과 같은 순서대로 overwrite됩니다.

1. Packages/Default/Base File.sublime-settings
2. Packages/Default/Base File (<platform>).sublime-settings
3. Packages/User/Base File.sublime-settings
4. Packages/<syntax>/<syntax>.sublime-settings
5. Packages/User/<syntax>.sublime-settings

보통의 경우는 3번 Packages/User/Base File.sublime-settings 의 설정에 넣어두면 되고,
특정파일타입에만 적용시키려면, 예를 들어 Python에서만 탭사이즈를 변경하려면 Packages/User/Python.sublime-settings 의 파일의 내용을 변경합니다.

{
"tab_size": 4,
"translate_tabs_to_spaces": false
}

# 탭을 화이트스페이스로 변경하거나 그 반대로 하고 싶다면, expand_tabs 또는 unexpand_tabs 명령을 사용하세요

이 내용은 http://www.sublimetext.com/docs/2/indentation.html에 적힌 내용입니다.

Wednesday, July 13, 2011

plug-in language가 javascript가 아닌 이유

http://www.sublimetext.com/blog/articles/choosing-an-extension-language을 보면 왜 플러그인 언어로 python을 선택했는 지 이야기가 나옵니다. 1.x버전에서는 scheme을 사용했다고 하는 군요.
그중에서 눈에 확 들어오는 부분이 있어서 옮겨 봅니다.

What about JavaScript? It’s an underrated, elegant language, with a huge number of people acquainted with its syntax. Its weakness is that it’s not used as a general purpose language, so there’s no selection of libraries your users will be able to build on. No libraries and no built-in standard APIs (file system access, I’m looking at you) rule JavaScript out.

너무 느슨한(유연한) 구조로 built-in standard API가 없다라는 점.
emeditor에서는 ActiveX를 사용해 우회할 수 있었지만, Linux나 OSX에서는 절대적으로 치명적인 이유가 되어 버리는 군요. 뼈아프게 공감해서 옮겨 적어보았습니다. m(__)m

이미지는 개발자의 블로그 http://www.sublimetext.com/blog/articles/anatomy-of-a-next-generation-text-editor 에서 스틸해 왔습니다.

이것이 제가 스크린이 작은 노트북과는 친하지 않은 이유입니다. ㅠㅠ;

따라서 한 번 해보세요

굉장히 좋은 장점을 가진 에디터라는 것을 잘 보여주는 예제가 되었으면 합니다만, 따라서 한 번 해보세요.

1) 이쪽에 접속해서 http://pastebin.mozilla.org/1635749 이 python의 내용을 그대로 $packages/User/Crowdy.py 에 저장해 봅니다.
$packages폴더는 alt-`를 눌러 콘솔을 열어 sublime.packages_path()를 두드려 보면 나옵니다.

# xp라면 경로는 c:\Documents and Settings\crowdy\Application Data\Sublime Text 2\Packages\User\crowdy.py 와 같이 됩니다. (집에 있는 데스크탑이 xp여서....)

2) Preference메뉴에서 User Key Bindings를 열어 다음을 등록해 둡니다.
[
{ "keys": ["f4"], "command": "crowdy_f4" },
{ "keys": ["alt+w"], "command": "crowdy_ex" }
]

"crowdy_f4"는 CrowdyF4Command 라는 클래스의 run(self, edit)을 실행시키구요.
"crowdy_ex"는 CrowdyExCommand클래스의 run(self)를 실행시키는 매핑입니다.
#run의 인수가 다른 것은 WindowCommand를 상속받았는 지, TextCommand를 상속받았는 지에 따라 달라집니다.

3) 끝났습니다. 사용은 어떻게 하느냐면요. alt+w 를 눌러보세요. 아래에 input box가 하나 나오면 edithost 라고 해보세요. edithost라고 해보셨으면 editthis라고도 해보시구요.

4) crowdy.py안에 >edit C:\temp\test.groovy 라고 되어 있는 부분이 있죠? 거기에 커서를 놓고 f4를 눌러보세요. 아마 파일이 없으면 빈 파일이 뜨겠지만, 존재하는 파일의 path라면 그 파일이 열립니다.

5) 그 다음은 확장하고 싶은 대로 확장하면 됩니다. alt+w 의 입력창에 'dic school'이라고 하면 웹에서 grep해 영영사전의 뜻을 출력할 수도 있구요. 꾸미기 나름입니다만, 자신만의 build커맨드 등등 추가하고 싶은 것을 추가할 수 있습니다.