diff --git a/init.vim b/init.vim
index c191f4e..8d9c932 100644
--- a/init.vim
+++ b/init.vim
@@ -123,8 +123,27 @@ autocmd BufNewFile *.{h,hpp} call <SID>insert_gates()
 nnoremap <space> za
 vnoremap <silent> . :normal .<CR>
 
-nnoremap q: :q
-nnoremap <leader>: q:
+"nnoremap q: :q
+"nnoremap <leader>: q:
+nnoremap <silent> q :<C-u>call <SID>SmartQ()<CR>
+function! s:SmartQ()
+  if exists("g:recording_macro")
+    let r = g:recording_macro
+    unlet g:recording_macro
+    normal! q
+    execute 'let @'.r.' = @'.r.'[:-2]'
+  else
+    let c = nr2char(getchar())
+    if c == ':'
+      call feedkeys(":q")
+    else
+      if c =~ '\v[0-9a-zA-Z"]'
+        let g:recording_macro = c
+      endif
+      execute 'normal! q'.c
+    endif
+  endif
+endfunction
 
 map <Left>  <C-w>h
 map <Down>  <C-w>j