LINUX.ORG.RU

Vim -> (X)Emacs indentation code


0

0

Добрый день, господа.
Перехожу с Vim-а на Emacs и появилась нужда перенести каким-то образом
indentation код для одного из режимов vim-a. Вот, собственно, как он выглядит:

" This function gets indentation level relative to an outer block and returns
" present indent or -1 if outer block doesn't exist.
function! s:ComputeIndent(shift)
  let lnum = search('^\S', 'bW')
  while lnum > 0 && synIDattr(synID(lnum, 1, 0), "name") !~ "Symbol"
    let lnum = search('^\S', 'bW')
  endwhile
  if lnum == 0
    let lnum = 1
  endif
"  echomsg "lnum =" lnum
  let open_brs = 0
  if getline(v:lnum) =~ "}$"
    let close_brs = -1
  else
    let close_brs = 0
  endif
"  exec "normal " . lnum . "G^"
  exec lnum
  while search('{', 'W') && line(".") < v:lnum 
    if synIDattr(synID(line("."), col("."), 0), "name") !~ "Symbol\\|Comment"
      let open_brs = open_brs + 1
    endif
  endwhile
"  exec "normal " . lnum . "G^"
  exec lnum
  while search('}', 'W') && line(".") <= v:lnum
    if synIDattr(synID(line("."), col("."), 0), "name") !~ "Symbol\\|Comment"
      let close_brs = close_brs + 1
    endif
  endwhile
"  echomsg "open_brs =" open_brs
"  echomsg "close_brs =" close_brs
  if open_brs > close_brs
"    exec "normal " . v:lnum . "G$"
    exec v:lnum
    let block_start = searchpair('{', '', '}', 'bW',
      \ 'synIDattr(synID(line("."), col("."), 0), "name") =~ "Symbol\\|Comment"')
    if block_start > 0
"      exec "normal " . s:top_line . "G^"
"      exec "normal " . s:bot_line . "G^"
      return indent(block_start) + a:shift * &sw
    endif
  endif
"  echo search('\%$')
"  exec "normal " . s:top_line . "G^"
"  exec "normal " . s:bot_line . "G^"
  if a:shift > 0
    return (a:shift - 1) * &sw
  endif
  return -1
endfunction

function! GetRefalIndent()
"  normal H
"  let s:top_line = line(".")
"  normal L
"  let s:bot_line = line(".")
"  echomsg s:top_line s:bot_line
  
  " For closing brace use indentation of outer block (i.e. opening brace).
  if getline(v:lnum) =~ '^[}[:blank:]]*}'
"    normal h
"    echomsg "}"
    return s:ComputeIndent(0)
  endif
  
  " Find a non-blank line above the current line.
  let lnum = prevnonblank(v:lnum - 1)
  let prev_line = getline(lnum)
 
" " If previous line was begining of a function definition then indent by one.
" if prev_line !~ ';\s*$' && synIDattr(synID(lnum, 1, 0), "name") =~ "Symbol"
"   return &sw
" endif
  
  " After opening brace always increase indentation by one.
  if prev_line =~ '{\s*$' &&
      \ synIDattr(synID(lnum, strlen(getline(lnum)), 0), "name") !~ 
      \ "Symbol\\|Comment"
"    echomsg "{"
    return indent(lnum) + &sw
  endif

  " Shift new sentence by one from outer block.
  if prev_line =~ ';\s*$'
    return s:ComputeIndent(1)
  endif
  
  " Shift continuing of a sentence by two.
  if prev_line =~ '[=,]\|\\!\|\\?\s*$'
    return s:ComputeIndent(2)
  endif

  " Leave everything else as is.
  return -1

endfunction

Буду очень благодарен за любую помощь...
anonymous

В вимовском коде чёрт ногу сломит. Но мне кажется, это неправильно - копировать вимовский подход. Сначала попробуй несколько существующих стилей индентации (k&r, stroustrup и много ещё). Если не понравится (хотя стоит ИМХО использовать один из стандартных стилей) - понастраивай форматирование в cc-mode, там много можно изменить просто присвоением переменным...

А начать лучше с медленного чтения документации :-)

hbee ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.