mintty の中でエクスプローラに表示されたパスをコピーして、そのパスに移動したいときがあります。
しかし、コピーして貼付けると表示されるのは "C:\HaskellPlatform\Clipboard-2.2.0\dist"のような文字列で、そのままでは CD コマンドなどには使えません。
欲しいのは "/C/HaskellPlatform/Clipboard-2.2.0/dist" のような文字列なのです。
引数から文字列を受け取って変換する処理をしようとすると、コピーを貼付けた文字列に '\' が含まれていますからエスケープされてしまいます。ディレクトリを区切る文字とエスケープの文字が同じなのが問題なのです。ツールを作るにも手作業で'\'を二個にしないと正しい文字列として認識されません。
System.Clipboardを使い、クリップボードから文字列を取得すればこの問題は回避できます。
$ cabal install Clipboard Resolving dependencies... Downloading Clipboard-2.2.0... Configuring Clipboard-2.2.0... (snip) Registering Clipboard-2.2.0...
-- ghc --make unixp.hs -o unixp module Main where import System (system) import System.Clipboard (getClipboardString, setClipboardString) main :: IO () main = do path <- getClipboardString case path of Nothing -> putStrLn "Empty." Just str -> do let unixPtath = toUnixPath str setClipboardString unixPtath putStrLn $ "from: " ++ str ++ "\nto: " ++ unixPtath where toUnixPath s = foldl (\acc ch -> acc ++ win2Unix ch) "/" s win2Unix c = case c of ':' -> "" '\\' -> "/" ch -> [ch]
Windows のPath文字列をコピーしてクリップボードに入れ、コマンドを実行するとUNIXのPath文字列に変更されてクリップボードに入るので、それをペーストして使います。
$ ./unixp from: C:\HaskellPlatform\Clipboard-2.2.0 to: /C/HaskellPlatform/Clipboard-2.2.0 $ cd /C/HaskellPlatform/Clipboard-2.2.0
mintty では Ctl + Ins でコピー。Ins でペースト。
- クリップボードの全角英数字文字列を半角、半角カナを全角に変換する。
import Cinnamon.Nkf (nkf) import System.Clipboard (getClipboardString, setClipboardString) import Codec.Binary.UTF8.String (decodeString, encodeString) main :: IO () main = getClipboardString >>= \clipString -> let out = case clipString of Nothing -> "" Just str -> decodeString $ nkf "-Wwm0Z0" $ encodeString str in setClipboardString out >> putStrLn "ZenToHan done."