2017年7月15日

WinSCP から Cygwin 上の Emacs を起動する

Abstract
  本投稿では,Cygwin 上にインストールされた,Emacs を,WinSCP から起動します.WinSCPは,MS-Windows上で動くオープンソースでグラフィカルなFTP,FTPS,SFTPクライアントプログラムです [1].WinSCP は,コマンドプロントからの呼び出しと同様の手法で,外部の様々なエディタを起動できます.しかし, Cygwin 上にインストールされた Emacs は,引数の与え方の関係で上手くいきません.そこで,本投稿では,まず,Cygwin 上にインストールした Emacs をコマンドプロントから呼び出します.次に,WinSCP からバッチファイルを経由することで,Cygwin 上の Emacs を起動する方法を提案します.
コマンドプロントからの Emacs 起動
コマンドプロントの起動
[Winキー] + [R] -> cmd -> [Enter]

コマンドプロントから Cygwin 上の Emacs を起動
C:\cygwin64\bin\mintty.exe  -i /Cygwin-Terminal.ico -e C:\cygwin64\bin\emacs-X11.exe
起動風景

同時に,デスクトップに用意したファイル a.txt を開く場合 (表示の問題により,改行表記) は,
C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico -e C:\cygwin64\bin\emacs-X11.exe
 /cygdrive/c/Users/[User Name]/Desktop/a.txt


ターミナルからではなく,Emacs の Window で起動
C:\cygwin64\bin\emacs-w32.exe
起動風景


  通常であれば,上記より,
C:\cygwin64\bin\mintty.exe  -i /Cygwin-Terminal.ico -e C:\cygwin64\bin\emacs-X11.exe /cygdrive/!.!
と WinSCP に指定することで,エディタを起動することができるはずです.(なお,"!.!" は,WinSCP により自動挿入される.この部分が編集先のファイルへのパスへと置換される.) しかしながら,WinSCP では,ファイルのパスを, C\XXX ではなく,C:\XXX と与えるため,emacs 側が上手く読み込むことができません.そこで,今回は,ディレクトリの受け渡しの段階で,バッチファイルを間に挟みます.
バッチファイルの作成
  置換により,コロン ':' を削除し,Emacs を実行するバッチファイルを記述します.

C:/cygwin64/home/[usr]/WinSCP2Emacs.bat
@echo off
set Input=%1
set buf=%Input::=%
set FilePath=%buf:\=/%
C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico -e C:\cygwin64\bin\emacs-X11.exe /cygdrive/%FilePath%

このとき,%[置換対象]:[置換前]=[置換後]% となります.
WinSCP の設定
  WinSCP に,エディタを指定します.

1. [オプション(O)]->[環境設定(P)...Ctrl+Alt+P]->[エディタ]->[エディタの設定]->[追加(A)...]->[エディタ]->[外部エディタ(E)]に,
C:\cygwin64\home\[usr]\WinSCP2Emacs.bat !.!
と設定する.

2. 画面そのままで,[外部エディタのオプション(リモートファイルの編集にのみ影響)]->[常にテキスト転送モードで転送する(T)]にチェックを入れる.
付録:バッチファイルを Emacs のショートカットとして利用
  本筋とは外れますが,先ほど作成したバッチファイルに,任意のテキストファイルをドラック&ドロップすると,Cygwin 上の Emacs で開くことができます. デスクトップにショートカットとして設置しておくと,便利にファイルへアクセスすることができます. 上記のバッチファイルのままでも,ファイルを開くことができますが,下記のように for 文を回す [2] ことで,一度に複数ファイルをドラック&ドロップで開くことができます.
@echo off
setlocal enabledelayedexpansion
set Input=
set buf=
set FilePath=
for %%a in (%*) do (
 set Input=%%a
 set buf=!Input::=!
 set FilePath=!buf:\=/!
 C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico -e C:\cygwin64\bin\emacs-X11.exe /cygdrive/!FilePath!
)
endlocal

if "%1" == "" (
 C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico -e C:\cygwin64\bin\emacs-X11.exe
)

※ 日本語入力が上手く機能しない場合は,一度 C:\cygwin64\bin\mintty.exe を手動で起動し,タスクバーを右クリック -> Options... -> Text において,Locate: ja_JP, Character set: UTF-8 と設定し,Save してください.
参考文献

0 件のコメント:

コメントを投稿