Хаскель (haskeline) завершение слова - PullRequest
23 голосов
/ 27 мая 2011

Haskeline позволяет очень легко получить функциональность завершения имени файла:

module Main where

import System.Console.Haskeline
import System.Environment

mySettings :: Settings IO
mySettings = defaultSettings {historyFile = Just "myhist"}

main :: IO ()
main = do
        args <- getArgs
        let inputFunc = getInputLine
        runInputT mySettings $ withInterrupt $ loop inputFunc 0
    where
        loop inputFunc n = do
            minput <-  handleInterrupt (return (Just "Caught interrupted"))
                        $ inputFunc (show n ++ ":")
            case minput of
                Nothing -> return ()
                Just s -> do
                            outputStrLn ("line " ++ show n ++ ":" ++ s)
                            loop inputFunc (n+1)

Он также предоставляет такие функции, как completeWord и completeQuotedWord, которые должны быть в состоянии использоваться так же, как и completeFilename для создания вышеуказанных функций.
(Другими словами, иметь завершение табуляции на основе списка слов (скажем, имен функций), а не на основе содержимого папки)

Может ли кто-нибудь предоставить рабочий пример - или рабочий код - этого?

Также полезны рекомендации для функций из других пакетов (например, HCL).

1 Ответ

22 голосов
/ 29 мая 2011

Это то, что вам нужно?

import Data.List

wordList = [ "Apple", "Pear", "Peach", "Grape", "Grapefruit", "Slime Mold"]

searchFunc :: String -> [Completion]
searchFunc str = map simpleCompletion $ filter (str `isPrefixOf`) wordList

mySettings :: Settings IO
mySettings = Settings { historyFile = Just "myhist"
                      , complete = completeWord Nothing " \t" $ return . searchFunc
                      , autoAddHistory = True
                      }

Замените определение mySettings в вашем фрагменте этим, и оно должно работать.

...