마크다운에서 백틱backtick 입력에 시달릴 때

Posted on March 22, 2023

뾰족한 수는 없겠거니 하고, 지금까지 아무런 조치없이 꿋꿋이 백틱을 입력하고 있었습니다. 그런데, 최근 kmonad를 설치하면서 쓸만한 키 조합이 많아져서, 어떻게든 해결 보겠다고 덤볐습니다.

환경
linux, xwindow, 세벌식, Neovim, 레오폴드 키보드 FC660M

필요 앱
KIME, KMonad, Neovim (nvim-autopairs, nvim-surround)

FC660M은 숫자 키패드가 없는 키보드로 ESC, ~, , ` 키가 하나의 키에 모두 모여 있습니다. 한글을 입력 중이라면, 영문 모드로 바꿔 FNESC를 함께 눌러 `를 입력합니다. 블로그 글을 많이 쓰면 쓸수록 점점 더 귀찮아지고 있는 상태였습니다.

KMonad

오른쪽 Ctrl키가 놀고 있습니다. FN과 같이 누르지 않고 입력하기 위해, 아래 설정으로 키값을 바꿔 놓습니다.

(deflayer default
  _    _    _    _    _    _    _    _    _    _    _    _    _    _
  _    _    _    _    _    _    _    _    _    _    _    _    _    _
  @ccr _    _    _    _    _    _    _    _    _    _    _    _   
  @sbs _    _    _    _    _    _    _    _    _    _    _
  _    _    _              _              _    `    
)

자세한 설정 방법은 터미널 Neovim에서 Ctrl + Enter 바인딩 잡기 - Kmonad 글을 참고해 주세요.

KIME

한글 모드건, 영문 모드건 오른쪽 Ctrl키를 누르면 `가 입력될 줄 알았는데, 한글 모드 상태에선 세벌식이 ` 키가 눌리면 별을 입력합니다. 세벌식 키보드 레이아웃을 바꿔야 합니다.

  1. .bashrc (zsh 쓰시면 .zshrc)
    디폴트로 있을 것 같은데, 아래 환경 변수가 안보여 만들었습니다.
export XDG_CONFIG_HOME=/home/user/.config
  1. /home/user/.config/kime/layouts/
    Riey/kime에서 sebeolsik-3-91.yaml를 다운 받습니다.(저는 세벌식 최종을 씁니다.)

그리고 62번줄을 다음으로 바꿉니다.

 `Grave : '`'

Neovim

위 설정으로 영문 한글 모드 상관없이 키 하나로 `를 입력할 수 있게 됐습니다. 이제 Neovim에서 편의를 위한 기능을 설정할 차례입니다.

nvim-autopairs

https://github.com/windwp/nvim-autopairs

{
  'windwp/nvim-autopairs',
  config = function()
    local npairs = require("nvim-autopairs")

    npairs.setup({
      fast_wrap = {
        map = '<C-a>',
        chars = { '{', '[', '(', '"', "'", '`' },
      }
      ...
    })
},

`를 감싸고 싶은 문자열 앞에 입력하면, 자동으로 ` ` 두 개가 입력되고, 그 사이에서 <Ctrl + a> 누르면 아래와 같이 몇 가지 룰에 따라 입력될 위치를 단축키로 선택할 수 있게 해줍니다.

autopair fast wrap

nvim-surround

https://github.com/kylechui/nvim-surround

{
  "kylechui/nvim-surround",
  lazy = false,
  config = function()
    -- 닫는 백틱 바로 다음에 커서가 있어야 하는데,
    -- 줄 끝일 경우 a로는 백틱 바로 앞에 커서가 있다.
    -- 줄 끝일 때는 A를 입력한다.
    local right = function ()
      local nowCol = vim.api.nvim_eval([[virtcol('.')]])
      local lastCol = vim.api.nvim_eval([[virtcol('$')]]) - 1
      if nowCol == lastCol then
        vim.cmd("startinsert!") -- !가 붙으면 A
      else
        vim.cmd("norm! a")
      end
    end
    require("nvim-surround").setup {}
    -- 디폴트 `ys`를 선행키로 잡으면 약간의 딜레이가 생긴다.
    -- 여기선 v모드를 이용한다.
    vim.keymap.set('n', 's', function() vim.cmd.normal("viwS`f`l") end, { desc = 'Surround backtick' })
    vim.keymap.set('i', '<C-s>', function() vim.cmd.normal("hviwS`f`l"); right() end, { silent = false })
    vim.keymap.set('v', '<C-s>', function() vim.cmd.normal("S`f`"); right() end, { silent = false })
  end,
  -- vi{ v모드 {괄호 안쪽 선택
},

아래 설명에서 []는 노멀모드 커서 위치, |는 입력모드 커서 위치

노멀 모드에서 단어 위에 커서가 있을 때

abc[d]ef ---- s키 ----> `abcdef`|

입력 모드에서 한 단어 끝에 있을 때

abcdef| ---- <ctrl + s> ----> `abcdef`|

비주얼 모드에서 감쌀 문자열 선택했을 때

[abc def ghi] ---- <ctrl + s> ----> `abc def ghi`|

할 수 있는 건 다한 듯 합니다. 위 설정들로 백틱 입력에서 어느 정도는 해방됐는데, 앉으면 눕고 싶다고, 특정 선택 영역에 있는 모든 영어 단어를 백틱으로 감싸 주기, Ai가 똑똑하게 감싸 주기…등이 떠오르지만, 지금만으로도 좀 과하게 노력을 투자했습니다. 하스켈 진도가 잘 안나가 Neovim만 만지작 하고 있습니다.

Korea Vim User Group 디스코드에 올렸던 내용들입니다. 아마도 딱 환경이 같은 분은 없을테지만, 이런 저런 힌트로 쓰일 곳이 있을 것 같아 정리해서 올립니다.

Github 계정이 없는 분은 메일로 보내주세요. lionhairdino at gmail.com