A long time ago, I explained how to draw arrows for open and closed immersions in tikz-cd. Back then I already mentioned that my solution is not completely satisfactory. Yun Hao took up the challenge, and significantly improved my implementation.


  open/.code     = {\tikzcdset{hook, circled};},
  closed/.code   = {\tikzcdset{hook, slashed};},
  open'/.code    = {\tikzcdset{hook', circled};},
  closed'/.code  = {\tikzcdset{hook', slashed};},
  circled/.code  = {\tikzcdset{markwith = {\draw (0,0) circle (.375ex);}};},
  slashed/.code  = {\tikzcdset{markwith = {\draw[-] (-.4ex,-.4ex) -- (.4ex,.4ex);}};},
  markwith/.code ={
    {\pgfutil@packageerror{tikz-cd}{You need to say %
      \string\usetikzlibrary{decorations.markings} to use arrows with markings}{}}{}%
    \pgfkeysalso{/tikz/postaction = {
      /tikz/decoration={markings, mark = at position 0.5 with {#1}}}

His example produces the following result

Observe that the position of the circle will be perfect in each font, whereas my solution was greatly font-dependent on how good the result was.

Many thanks to him for letting sharing his code!