@@ -11,7 +11,9 @@ module Neuron.CLI.Search
1111 )
1212where
1313
14+ import Data.FileEmbed (embedOneStringFileOf )
1415import qualified Data.Text as Text
16+ import Data.Text.IO (hPutStr )
1517import Development.Shake (Action )
1618import Neuron.CLI.Rib
1719 ( SearchBy (SearchByContent , SearchByTitle ),
@@ -20,11 +22,13 @@ import Neuron.CLI.Rib
2022import Neuron.Config.Type (Config , getZettelFormats )
2123import Neuron.Reader.Type (ZettelFormat (ZettelFormat_Org ), zettelFormatToExtension )
2224import Relude
23- import System.Posix.Process
24- import System.Which
25+ import System.IO (hClose )
26+ import System.IO.Temp (withSystemTempFile )
27+ import System.Posix.Files (setFileMode )
28+ import System.Posix.Process (executeFile )
2529
26- neuronSearchScript :: FilePath
27- neuronSearchScript = $ (staticWhich " neuron-search" )
30+ searchScript :: Text
31+ searchScript = $ (embedOneStringFileOf [ " ./src-bash/ neuron-search" , " ./neuron/src-bash/neuron-search " ] )
2832
2933searchScriptArgs :: (NonEmpty ZettelFormat ) -> SearchCommand -> [String ]
3034searchScriptArgs formats SearchCommand {.. } =
@@ -43,8 +47,16 @@ interactiveSearch notesDir searchCmd config =
4347 zettelFormats <- getZettelFormats config
4448 if searchBy searchCmd == SearchByTitle && ZettelFormat_Org `elem` toList zettelFormats
4549 then fail " search is not supported for .org files"
46- else liftIO $ execScript neuronSearchScript $ notesDir : searchScriptArgs zettelFormats searchCmd
50+ else liftIO $ do
51+ asExecutableScript " neuron-search" searchScript $ \ scriptFile -> do
52+ execScript scriptFile $ notesDir : searchScriptArgs zettelFormats searchCmd
4753 where
54+ asExecutableScript k s f =
55+ withSystemTempFile k $ \ fp hdl -> do
56+ hPutStr hdl s
57+ hClose hdl
58+ setFileMode fp 0o700
59+ f fp
4860 execScript scriptPath args =
4961 -- We must use the low-level execvp (via the unix package's `executeFile`)
5062 -- here, such that the new process replaces the current one. fzf won't work
0 commit comments