Skip to content

Commit d151e47

Browse files
Move Hclip to yi-core
Add disable-hclip function
1 parent 2fa57e3 commit d151e47

10 files changed

Lines changed: 63 additions & 14 deletions

File tree

yi-core/src/Yi/Clip.hs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{-# OPTIONS_HADDOCK show-extensions #-}
2+
3+
-- |
4+
-- Module : Yi.Clip
5+
-- License : GPL-2
6+
-- Maintainer : yi-devel@googlegroups.com
7+
-- Stability : experimental
8+
-- Portability : portable
9+
--
10+
-- A proxy of clipboard.
11+
12+
module Yi.Clip ( setClipboard
13+
, getClipboard
14+
)
15+
where
16+
17+
import qualified System.Hclip as H (getClipboard, setClipboard)
18+
import Data.IORef
19+
import System.IO.Unsafe
20+
21+
import Yi.Types (configDisableSystemClipboard, askCfg)
22+
import Yi.Utils (io)
23+
import Yi.Keymap (YiM)
24+
25+
clipboard :: IORef String
26+
clipboard = unsafePerformIO $ newIORef ""
27+
28+
getClipboard' :: IO String
29+
getClipboard' = readIORef clipboard
30+
31+
setClipboard' :: String -> IO ()
32+
setClipboard' = writeIORef clipboard
33+
34+
getClipboard :: YiM String
35+
getClipboard = do
36+
config <- askCfg
37+
if configDisableSystemClipboard config
38+
then io getClipboard'
39+
else io H.getClipboard
40+
41+
setClipboard :: String -> YiM ()
42+
setClipboard text = do
43+
config <- askCfg
44+
if configDisableSystemClipboard config
45+
then io $ setClipboard' text
46+
else io $ H.setClipboard text

yi-core/src/Yi/Config/Default.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ defaultConfig =
108108
, bufferUpdateHandler = mempty
109109
, layoutManagers = [hPairNStack 1, vPairNStack 1, tall, wide]
110110
, configVars = mempty
111+
, configDisableSystemClipboard = False
111112
}
112113

113114
nilKeymap :: Keymap

yi-core/src/Yi/Config/Simple.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ import Yi.Config(Config, UIConfig, startFrontEndA, configUIA,
148148
CursorStyle(..), configLeftSideScrollBarA,
149149
configAutoHideScrollBarA, configAutoHideTabBarA,
150150
configLineWrapA, configWindowFillA, configThemeA,
151-
layoutManagersA, configVarsA, configLineNumbersA
151+
layoutManagersA, configVarsA, configLineNumbersA,
152+
configDisableSystemClipboardA
152153
)
153154

154155

yi-core/src/Yi/Types.hs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,8 +434,11 @@ data Config = Config {startFrontEnd :: UIBoot,
434434
bufferUpdateHandler :: !(S.Seq (S.Seq Update -> BufferM ())),
435435
layoutManagers :: ![AnyLayoutManager],
436436
-- ^ List of layout managers for 'cycleLayoutManagersNext'
437-
configVars :: !ConfigState.DynamicState
437+
configVars :: !ConfigState.DynamicState,
438438
-- ^ Custom configuration, containing the 'YiConfigVariable's. Configure with 'configVariableA'.
439+
configDisableSystemClipboard :: !Bool
440+
-- ^ Set to 'True' not to use system clipboard.
441+
-- When vty-mode, system clipboard is not available in some environments.
439442
}
440443

441444

yi-core/yi-core.cabal

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ library
5454
, yi-language >= 0.17
5555
, yi-rope >= 0.10
5656
, exceptions
57+
, Hclip
5758
if flag(hint)
5859
cpp-options: -DHINT
5960
build-depends:
@@ -74,6 +75,7 @@ library
7475
Yi.Buffer.Region
7576
Yi.Buffer.TextUnit
7677
Yi.Buffer.Undo
78+
Yi.Clip
7779
Yi.Command
7880
Yi.Command.Help
7981
Yi.Completion

yi-keymap-emacs/src/Yi/Keymap/Emacs/KillRing.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ import Yi.Buffer
1919
import Yi.Editor (EditorM, killringA, withCurrentBuffer)
2020
import Yi.Keymap (YiM)
2121
import Yi.KillRing (Killring (_krContents), krKilled, krPut)
22+
import Yi.Clip (getClipboard, setClipboard)
2223
import qualified Yi.Rope as R (YiString, fromString, toString)
2324
import Yi.Types (withEditor)
2425
import Yi.Utils (io)
25-
import System.Hclip (getClipboard, setClipboard)
2626

2727
uses :: forall a b f s. MonadState s f => Getting a s a -> (a -> b) -> f b
2828
uses l f = f <$> use l
@@ -32,7 +32,7 @@ uses l f = f <$> use l
3232
-- | Adds system clipboard's contents on top of the killring if not already there
3333
clipboardToKillring :: YiM ()
3434
clipboardToKillring = do
35-
text <- fmap R.fromString $ io getClipboard
35+
text <- fmap R.fromString $ getClipboard
3636
withEditor $ do
3737
text' <- killringGet
3838
when (text' /= text) $ killringPut Forward text
@@ -41,7 +41,7 @@ clipboardToKillring = do
4141
killringToClipboard :: YiM ()
4242
killringToClipboard = do
4343
text <- withEditor killringGet
44-
io . setClipboard $ R.toString text
44+
setClipboard $ R.toString text
4545

4646
-- This is like @kill-region-or-backward-word@.
4747
killRegionB :: BufferM ()

yi-keymap-emacs/yi-keymap-emacs.cabal

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ library
2121
base >= 4.8 && < 5
2222
, containers
2323
, filepath
24-
, Hclip
2524
, microlens-platform
2625
, mtl
2726
, oo-prototypes

yi-keymap-vim/src/Yi/Keymap/Vim/Ex/Commands/Copy.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import Yi.Types (YiM, BufferM)
2323
import Yi.Rope (toString)
2424
import Yi.Buffer.Region (readRegionB, Region)
2525
import Control.Monad.Base (liftBase)
26-
import System.Hclip (setClipboard)
26+
import Yi.Clip (setClipboard)
2727
import Yi.Core (errorEditor)
2828

2929
parse :: EventString -> Maybe ExCommand
@@ -38,5 +38,5 @@ parse = Common.parse $ do
3838
copy :: Maybe (BufferM Region) -> YiM ()
3939
copy maybeGetRegion = case maybeGetRegion of
4040
Nothing -> errorEditor "Cannot copy: No region"
41-
Just getRegion -> liftBase . setClipboard . toString
41+
Just getRegion -> setClipboard . toString
4242
=<< withCurrentBuffer (readRegionB =<< getRegion)

yi-keymap-vim/src/Yi/Keymap/Vim/Utils.hs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ import Yi.Monad (whenM)
5050
import Yi.Rope (YiString, countNewLines, last)
5151
import qualified Yi.Rope as R (replicateChar, snoc, toString, fromString)
5252
import Yi.Utils (io)
53-
import System.Hclip (getClipboard, setClipboard)
53+
import Yi.Clip (getClipboard, setClipboard)
5454

5555
-- 'mkBindingE' and 'mkBindingY' are helper functions for bindings
5656
-- where VimState mutation is not dependent on action performed
@@ -208,11 +208,10 @@ addNewLineIfNecessary rope =
208208

209209
pasteFromClipboard :: YiM ()
210210
pasteFromClipboard = do
211-
text <- fmap R.fromString $ io getClipboard
211+
text <- fmap R.fromString $ getClipboard
212212
withCurrentBuffer $ insertRopeWithStyleB text Inclusive
213213

214214
exportRegisterToClipboard :: RegisterName -> YiM ()
215215
exportRegisterToClipboard name = do
216216
mbr <- withEditor $ getRegisterE name
217-
io . setClipboard $ maybe "" (R.toString . regContent) mbr
218-
217+
setClipboard $ maybe "" (R.toString . regContent) mbr

yi-keymap-vim/yi-keymap-vim.cabal

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ library
5656
, data-default
5757
, directory
5858
, filepath
59-
, Hclip
6059
, microlens-platform
6160
, mtl
6261
, oo-prototypes
@@ -141,7 +140,6 @@ test-suite spec
141140
, data-default
142141
, directory
143142
, filepath
144-
, Hclip
145143
, microlens-platform
146144
, mtl
147145
, oo-prototypes

0 commit comments

Comments
 (0)