PATH_SCREEN= "/usr/bin/screen" PATH_GET_REGISTER="/tmp/screen-getregister" PATH_STUFF="/tmp/screen-stuff" # stuff時に一時的に使用するレジスタ名 REGISTER_STUFF_TMP="y" # emacsの動いているウインドウを特定するための名前 TITLE_EMACS="emacs" DEBUG=false class Screen # コマンド実行 def self.invoke1(expression) system "#{PATH_SCREEN} -X #{expression}" end # コマンド実行(複数) def self.invoke(expression) # XXX system "#{PATH_SCREEN} -X eval #{expression}" end # 指定ウインドウにコマンド発行 def self.invokeat(window, expression) system "#{PATH_SCREEN} -X at #{window} #{expression}" end # Screenの中かどうか調査 def self.check_inscreen() !(ENV['WINDOW'] == nil) end # ウインドウ番号を得る def self.get_windowid() ENV['WINDOW'] end # ウインドウのタイトルを得る(not implemented) def self.get_windowtitle() # XXX どうやって作ったもんでしょね。libscream? end # レジスタの中身を得る def self.get_register(name) if name != '.' then # XXX preserve? Screen.invoke1("paste #{name} .") end Screen.invoke1("writebuf #{PATH_GET_REGISTER}") # XXX recovery time? File.readlines(PATH_GET_REGISTER).join end # 指定ウインドウに文字列をペーストする def self.paste(window, str) f = File.open(PATH_STUFF, "w") f.print str f.close invoke("'readreg #{REGISTER_STUFF_TMP} #{PATH_STUFF}' 'at #{window} paste #{REGISTER_STUFF_TMP}'") end # 指定ウインドウをforeにする def self.select_window(window) invoke1("select #{window}") end # 一行取得 def self.get_line() invoke("'copy' 'stuff \"0 $ \"'") get_register(".") end # カーソルの左側を取得 def self.get_lhs_of_line() invoke("'copy' 'stuff \" 0 \"'") get_register(".") end # Emacsにコマンドを発行する def self.invoke_elisp(expression) invokeat(TITLE_EMACS, "stuff ''") invokeat(TITLE_EMACS, "stuff 'xeval-expression #{expression} '") end def self.put_to_errorbuf(str) Screen.invoke_elisp("(switch-to-buffer \"*TagJump*\")") Screen.paste(TITLE_EMACS, Time.now.to_s + " " + str) end def self.debugprint(str) put_to_errorbuf(str) if DEBUG end end