使用.s文件设置文件类型和注释键映射

时间:2017-01-20 03:40:00

标签: linux assembly vim

我正在使用.s文件。虽然此文件是asm文件,但它与.asm文件不同(评论以--开头,而不是#)。

因此,当我打开.s文件时,它显示为asm文件。如何更改文件类型以正确显示(--符号后的蓝色)?

另外,我已将F1中的vimrc映射到评论如下:

if (@% =~ "\.s") "if file is .s
   map <F1> :<ESC>0i-- <ESC>j
endif

此方法适用于其他文件,但不适用于.s文件。评论标记为#,因为我之前已将F1映射为#

你能帮助我吗?

非常感谢

1 个答案:

答案 0 :(得分:1)

站在巨人的肩膀上

高度推荐评论插件,例如commentary(我使用的),Nerd CommenterEnhCommentifytComment,..., etc。使用插件并不羞耻。特别是因为评论翻转看起来比预期更复杂。

自定义Commentary.vim

只需将'commentstring'设置为您的文件类型的评论样式即可。如果Vim识别您的文件类型,通常会为您设置。请参阅:h 'commentstring'

更改php 'commentstring'的示例。将以下内容添加到~/.vim/ftplugin/asm.vim

if expand('%:t') =~# '\.s$'
  set commentstring=--\ %s
endif

或者如果您更喜欢vimrc文件中的所有内容:

autocmd FileType asm if expand('%:t') =~# '\.s$' | set commentstring=--\ %s | endif

您可以将切换注释命令设置为<f1>,如下所示:

nmap <f1> <Plug>CommentaryLine

然而,评论与主行更接近,并且不与任何本地映射冲突。

注意:我使用评论这可能不适用于其他评论插件。一如既往,请阅读文档。

语法

您可能需要更改语法文件以显示以--开头的行作为注释。将以下内容添加到~/.vim/after/syntax/asm.vim

syntax match asmComment /--\_s.*$/

但我没有或不能使用插件

有时使用插件不是一种选择,但你应该知道(de-)评论比最初看起来要复杂得多。特别是如果您需要跨多个文件类型执行此操作。像commentary.vim这样的插件允许您一次注释多行或使用动作,例如gcip

最简单的方法。仅评论:

autocmd FileType asm nnoremap <buffer> <F1> gI-- <ESC>j

现在有些人用map-expression切换:

autocmd FileType asm nnoremap <buffer> <expr> <f1> getline('.') =~ '^\s*--\_s' ? "^3"_x+" : "gI-- \<esc>+"

我还创建了一个naive commentary.vim-style注释切换映射。将以下内容放在vimrc文件中:

nnoremap gcc :<c-u>.,.+<c-r>=v:count<cr>call <SID>toggleComment()<cr>
nnoremap gc :<c-u>set opfunc=<SID>commentOp<cr>g@
xnoremap gc :call <SID>toggleComment()<cr>

function! s:commentOp(...)
  '[,']call s:toggleComment()
endfunction

function! s:toggleComment() range
  let comment = substitute(get(b:, 'commentstring', &commentstring), '\s*\(%s\)\s*', '%s', '')
  let pattern = '\V' . printf(escape(comment, '\'), '\(\s\{-}\)\s\(\S\.\{-}\)\s\=')
  let replace = '\1\2'
  if getline('.') !~ pattern
    let indent = matchstr(getline('.'), '^\s*')
    let pattern = '^' . indent . '\zs\(\s*\)\(\S.*\)'
    let replace = printf(comment, '\1 \2' . (comment =~ '%s$' ? '' : ' '))
  endif
  for lnum in range(a:firstline, a:lastline)
    call setline(lnum, substitute(getline(lnum), pattern, replace, ''))
  endfor
endfunction

更多信息

:h 'commentstring'
:h :set
:h filetype
:h new-filetype
:h ftdetect
:h ftplugins
:h after-directory
:h :syn-match
:h :autocmd
:h :map-expression
:h :map-local