クリップボード内のWindows Path文字列をUNIX Path文字列に変更する(Haskell)。

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."