packages feed

chiasma-0.10.2.0: lib/Chiasma/Command/Pane.hs

module Chiasma.Command.Pane where

import Prelude hiding (output)

import qualified Chiasma.Codec.Data.Pane as Codec (Pane)
import qualified Chiasma.Codec.Data.PaneMode as Codec (PaneMode (PaneMode))
import Chiasma.Data.Axis (Axis)
import Chiasma.Data.CapturePaneParams (CaptureOutput (Stdout), CapturePaneParams (..))
import qualified Chiasma.Data.CopyModeParams as CopyModeParams
import qualified Chiasma.Data.KillPaneParams as KillPaneParams
import qualified Chiasma.Data.PaneSelection as PaneSelection
import qualified Chiasma.Data.Panes as Panes
import Chiasma.Data.Panes (TmuxPanes)
import Chiasma.Data.PipePaneParams (PipePaneParams (..))
import Chiasma.Data.ResizePaneParams (ResizeAbsolute (ResizeAbsolute), ResizePaneParams (..))
import qualified Chiasma.Data.SelectParams as SelectParams
import qualified Chiasma.Data.SendKeysParams as SendKeysParams
import Chiasma.Data.SendKeysParams (Key, SendKeysParams (..))
import Chiasma.Data.SplitParams (JoinPaneParams (axis, detach, source, target))
import qualified Chiasma.Data.Target as Target
import Chiasma.Data.TmuxCommand (TmuxCommand (..))
import Chiasma.Data.TmuxId (PaneId, WindowId)
import Chiasma.Data.View (View (View))
import qualified Chiasma.Effect.TmuxApi as Tmux
import Chiasma.Effect.TmuxApi (Tmux)

panes ::
  Member (TmuxPanes a) r =>
  Sem r [a]
panes =
  Tmux.send (Panes.List PaneSelection.All)

pane ::
  Member (TmuxPanes a) r =>
  PaneId ->
  Sem r (Maybe a)
pane paneId =
  Tmux.send (Panes.Find paneId)

windowPanes ::
  Member (TmuxPanes a) r =>
  WindowId ->
  Sem r [a]
windowPanes windowId =
  Tmux.send (Panes.List (PaneSelection.InWindow (Target.Window windowId)))

firstWindowPane ::
  Member (TmuxPanes a) r =>
  WindowId ->
  Sem r a
firstWindowPane windowId =
  Tmux.send (Panes.First (PaneSelection.InWindow (Target.Window windowId)))

closePane ::
  Member Tmux r =>
  PaneId ->
  Sem r ()
closePane paneId =
  Tmux.send (KillPane def { KillPaneParams.target = Target.Pane paneId })

isPaneIdOpen ::
  Member (TmuxPanes Codec.Pane) r =>
  PaneId ->
  Sem r Bool
isPaneIdOpen paneId =
  isJust <$> pane paneId

isPaneOpen ::
  Member (TmuxPanes Codec.Pane) r =>
  View PaneId ->
  Sem r Bool
isPaneOpen (View _ (Just paneId)) =
  isPaneIdOpen paneId
isPaneOpen _ =
  pure False

movePane ::
  Member Tmux r =>
  PaneId ->
  PaneId ->
  Axis ->
  Sem r ()
movePane paneId refId axis =
  Tmux.send (MovePane def {
    detach = True,
    source = Just (Target.Pane paneId),
    target = Target.Pane refId,
    axis = Just axis
  })

resizePane ::
  Member Tmux r =>
  PaneId ->
  Axis ->
  Int ->
  Sem r ()
resizePane paneId axis size =
  Tmux.send (ResizePane def {
    target = Target.Pane paneId,
    absolute = Just (ResizeAbsolute axis size)
  })

sendKeys ::
  Member Tmux r =>
  PaneId ->
  [Key] ->
  Sem r ()
sendKeys paneId lines' =
  for_ lines' \ line ->
    Tmux.send (SendKeys def { target = Target.Pane paneId, keys = [line] })

pipePane ::
  Member Tmux r =>
  PaneId ->
  Text ->
  Sem r ()
pipePane paneId cmd =
  Tmux.schedule (PipePane def { target = Target.Pane paneId, command = Just cmd })

capturePane ::
  Member Tmux r =>
  PaneId ->
  Sem r [Text]
capturePane paneId =
  Tmux.send (CapturePane def { target = Target.Pane paneId, escapeSequences = True, output = Just Stdout})

selectPane ::
  Member Tmux r =>
  PaneId ->
  Sem r ()
selectPane paneId =
  Tmux.send (SelectPane def { SelectParams.target = Target.Pane paneId })

copyMode ::
  Member Tmux r =>
  PaneId ->
  Sem r ()
copyMode paneId =
  Tmux.send (CopyMode def { CopyModeParams.target = Target.Pane paneId })

paneMode ::
  Member (TmuxPanes Codec.PaneMode) r =>
  PaneId ->
  Sem r (Maybe Codec.PaneMode)
paneMode =
  pane

quitCopyMode ::
  Member Tmux r =>
  Member (TmuxPanes Codec.PaneMode) r =>
  PaneId ->
  Sem r ()
quitCopyMode paneId =
  traverse_ check =<< pane paneId
  where
    check (Codec.PaneMode _ mode) =
      when (mode == "copy-mode") do
        Tmux.send (SendKeys def { target = Target.Pane paneId, SendKeysParams.copyMode = True, keys = ["cancel"] })