diff --git a/lib/Ribosome/Data/Ribo.hs b/lib/Ribosome/Data/Ribo.hs
--- a/lib/Ribosome/Data/Ribo.hs
+++ b/lib/Ribosome/Data/Ribo.hs
@@ -9,9 +9,9 @@
 
 import Control.Concurrent.STM.TVar (modifyTVar)
 import qualified Control.Lens as Lens (view, over, at)
-import qualified Data.Map.Strict as Map (insert, delete)
+import qualified Data.Map.Strict as Map (insert)
 import UnliftIO (finally)
-import UnliftIO.STM (TVar, atomically, readTVarIO)
+import UnliftIO.STM (TVar, TMVar, atomically, readTVarIO, newTMVarIO, tryTakeTMVar, tryPutTMVar)
 import Neovim (Neovim, ask)
 import Ribosome.Data.Ribosome (Ribosome(Ribosome), Locks)
 import qualified Ribosome.Data.Ribosome as Ribosome (_locks, locks)
@@ -50,20 +50,20 @@
   Ribosome _ intTv _ <- ask
   atomically $ modifyTVar intTv $ Lens.over Ribosome._locks f
 
-unlock :: String -> Ribo e ()
-unlock key =
-  modifyLocks $ Map.delete key
-
-lock :: String -> Ribo e Bool
-lock key = do
+getOrCreateLock :: String -> Ribo e (TMVar ())
+getOrCreateLock key = do
   currentLock <- inspectLocks $ Lens.view $ Lens.at key
   case currentLock of
-    Just _ -> return True
+    Just tv -> return tv
     Nothing -> do
-      modifyLocks $ Map.insert key ()
-      return False
+      tv <- newTMVarIO ()
+      modifyLocks $ Map.insert key tv
+      getOrCreateLock key
 
 lockOrSkip :: String -> Ribo e () -> Ribo e ()
 lockOrSkip key thunk = do
-  running <- lock key
-  if running then return () else finally thunk $ unlock key
+  currentLock <- getOrCreateLock key
+  currentState <- atomically $ tryTakeTMVar currentLock
+  case currentState of
+    Just _ -> finally thunk $ atomically $ tryPutTMVar currentLock ()
+    Nothing -> return ()
diff --git a/lib/Ribosome/Data/Ribosome.hs b/lib/Ribosome/Data/Ribosome.hs
--- a/lib/Ribosome/Data/Ribosome.hs
+++ b/lib/Ribosome/Data/Ribosome.hs
@@ -14,12 +14,12 @@
 ) where
 
 import Control.Lens (makeClassy_)
-import UnliftIO.STM (TVar, newTVarIO)
+import UnliftIO.STM (TVar, newTVarIO, TMVar)
 import Control.Monad.IO.Class (MonadIO)
 import Data.Map.Strict (Map)
 import qualified Data.Map.Strict as Map (empty)
 
-type Locks = Map String ()
+type Locks = Map String (TMVar ())
 
 newtype RibosomeInternal =
   RibosomeInternal {
diff --git a/proteome.cabal b/proteome.cabal
--- a/proteome.cabal
+++ b/proteome.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 3835aa8ef5ed7fc0653a8b4d5cf6e0200e154f66d9076b365a05f2318ad73f73
+-- hash: 4a4fe5d2c7d0d545c6bd569a39b33f33bda07bc0c6c5e88da960f4fdda134ea6
 
 name:           proteome
-version:        0.3.7.0
+version:        0.3.8.0
 synopsis:       neovim project manager
 description:    Please see the README on GitHub at <https://github.com/tek/proteome-hs>
 category:       Neovim
