neuron-0.6.0.0: src/app/Neuron/CLI/Search.hs
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Neuron.CLI.Search
( interactiveSearch,
)
where
import Neuron.CLI.Rib
import Relude
import System.Posix.Process
import System.Which
neuronSearchScript :: FilePath
neuronSearchScript = $(staticWhich "neuron-search")
searchScriptArgs :: SearchCommand -> [String]
searchScriptArgs SearchCommand {..} =
let searchByArgs =
case searchBy of
SearchByTitle -> ["(^# )|(^title: )", "2"]
SearchByContent -> ["", "2"]
editArg =
bool "echo" "$EDITOR" searchEdit
in searchByArgs <> [editArg]
interactiveSearch :: FilePath -> SearchCommand -> IO ()
interactiveSearch notesDir searchCmd =
execScript neuronSearchScript $ notesDir : searchScriptArgs searchCmd
where
execScript scriptPath args =
-- We must use the low-level execvp (via the unix package's `executeFile`)
-- here, such that the new process replaces the current one. fzf won't work
-- otherwise.
void $ executeFile scriptPath False args Nothing