Сделать Vim фигурные скобки, квадратные скобки, Parens действуют как TextMate - PullRequest
16 голосов
/ 20 мая 2011

Так что я думаю, что я не ищу нужную вещь, но я смотрю, как вы можете заставить VIM вести себя как Textmate, когда дело доходит до написания набора фигурных скобок, скобок или квадратных скобок, нажмите ввод иВы получаете это.Трубка указывает курсор.

      function doSomething(){
          |
      }

      #selector{
          |
      }

Вместо этого мусора

      function doSomething(){
      |}

      #selector{
      |}

У меня уже есть [{(закрывая друг друга, когда они набираются, только возврат и отступ отступают. Как обычнолюбая помощь будет оценена.

Ответы [ 7 ]

25 голосов
/ 20 мая 2011

Я использую следующие сопоставления в моем .vimrc:

inoremap {<cr> {<cr>}<c-o>O<tab>
inoremap [<cr> [<cr>]<c-o>O<tab>
inoremap (<cr> (<cr>)<c-o>O<tab>

Итак, когда я ввожу:

function foo(){<cr>

Я получаю:

function foo(){
    |
}

Аналогично (<cr> и [<cr>.

4 голосов
/ 28 мая 2015

Примечание для пользователей delimitMate

При использовании плагина delimitMate сопоставления других ответов мешают плагину. К счастью, это поведение уже доступно в delimitMate (но по умолчанию отключено), установив параметры delmitMateExpansion. Например. добавить

let delimitMate_expand_cr = 1

к вашему .vimrc

4 голосов
/ 06 сентября 2013

Это моя модификация ответа Рэнди Мориса, которая лучше работает для меня:

inoremap {<cr> {<cr>}<c-o><s-o>
inoremap [<cr> [<cr>]<c-o><s-o>
inoremap (<cr> (<cr>)<c-o><s-o>
0 голосов
/ 10 августа 2012

У меня на .vimrc

есть следующее
  imap {<Space> {<Space><Space>}<left><left>
  imap { {<CR>}
  imap {<CR> {<CR><CR>}<Up>;<Esc>==i

  imap ( ()
  imap () ()
  inoremap <silent> (. ().<C-x><C-o>
  inoremap <silent> (- ()-><C-x><C-o>
  imap (<space> (<space><space>)<left><left>

  imap [ []
  imap [<space> [<space><space>]<left><left>

  inoremap " ""<left>
  inoremap "" ""

хорошо, объяснения: когда вы нажимаете {, иногда вы хотите разбить строку, поставить и завершить}, но иногда вы просто хотите остаться в той же строке, например: a = {1,2,3};

# означает, где находится курсор:

Итак, когда вы нажимаете { и сразу после этого вы нажимаете пробел -> { # } когда вы нажмете { после небольшой задержки или использования любого другого, кроме пробела, строка будет прервана когда вы нажмете { сразу после ввода, код будет:

foo(){
   #
}

Когда вы нажмете (., вы получите ().<call to omnicomplete> Простое пространство имен строк :: Singleton :: Create ().

Вы должны использовать inoremap с ", чтобы избежать бесконечности. "" "" "" "" "" "" "" "" "" "" ""

0 голосов
/ 07 октября 2011

Если вам нравится Text make, вы должны проверить Плагин Vim, snipMate , как указано tarek11011.

Для C / C ++ по умолчанию имеется фрагмент кода для функций

# Function
snippet fun
   ${1:void} ${2:function_name}(${3}) {
      ${4:/* code */}
   }

, что решит проблему с фигурными скобками.

0 голосов
/ 20 мая 2011

У меня есть set ai в моем vimrc, который, я полагаю, делает то, что вы хотите?

0 голосов
/ 20 мая 2011

Мое решение для этого было поместить эту маленькую функцию (с соответствующим отображением режима вставки) в мой .vimrc:

fun! MyCR()
    if strpart(getline('.'), col('.') - 2, 2) == '{}'
        return "\<CR>\<CR>\<Up>\<Tab>"
    endif
    return "\<CR>"
endfun
autocmd FileType c,cpp inoremap <CR> <C-R>=MyCR()<CR>

Вы можете изменить autocmd так, чтобы он работал для предпочитаемых вами типов файлов.

Он переопределяет <CR> в режиме вставки, чтобы проверить, находится ли курсор в данный момент внутри фигурных скобок, и добавляет дополнительную строку и отступ, где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...