Khối chuyển động cho loại khung nào?


8

Nếu tôi muốn, nói xóa một khối, tôi có thể sử dụng chuyển động của đối tượng văn bản.

Tức là nếu văn bản của tôi trông như thế này:

(let [a 1 b {:x 3  :y 4}]
      a)

Và con trỏ là ví dụ về nhân vật 3.

Nếu tôi gõ diBthì :x 3 :y 4sẽ bị xóa Nếu đúng daBthì cả khối và dấu ngoặc xung quanh đều bị xóa:{:x 3 :y 4}

Vì vậy, mô hình là:

operation inclusion block-motion

Trường hợp hoạt động có thể là:

  • d - xóa bỏ

  • c - thay đổi

  • y - sao chép ...

bao gồm một trong hai:

  • i - bên trong (không có dấu ngoặc) hoặc

  • a - tất cả

và chuyển động khối:

  • b, (Hoặc )cho ()Parens

  • B, {Hoặc }cho {}curlies

  • [hoặc ]<hoặc >cho dấu ngoặc tương ứng của riêng họ, v.v.

Bây giờ, câu hỏi là: Có một chuyển động khối cho khối bên trong nhất với dấu ngoặc của bất kỳ loại nào trong số này không?

Tôi muốn có thể làm gì da?với ?chuyển động mà tôi đang tìm kiếm. Và nếu con trỏ trong ví dụ của tôi ở trên là trong vòng {}nói trên 3Tôi muốn xóa chỉ {}nhưng nếu con trỏ của tôi là trên bTôi muốn xóa các []khối vv

Câu trả lời:


3

Đây là lý do tại sao câu hỏi nên có trên SO: kịch bản không tầm thường là bắt buộc ...

" Public Mappings {{{1
onoremap <silent> i% :<c-u>call <sid>SelectFirstPair(1,0)<cr>
xnoremap <silent> i% :<c-u>call <sid>SelectFirstPair(1,1)<cr><esc>gv
onoremap <silent> a% :<c-u>call <sid>SelectFirstPair(0,0)<cr>
xnoremap <silent> a% :<c-u>call <sid>SelectFirstPair(0,1)<cr><esc>gv
" Public Mappings }}}1
"------------------------------------------------------------------------
" Private Functions {{{1
" Note: most functions are best placed into
" autoload/«your-initials»/«omap_any_bracket».vim
" Keep here only the functions are are required when the plugin is loaded,
" like functions that help building a vim-menu for this plugin.
let s:k_pairs = {
      \ '(': ')',
      \ '[': ']',
      \ '{': '}',
      \ '<': '>'
      \ }

let s:k_begin = '[([{<]'
let s:k_end   = '[)\]}>]'

function! s:SelectFirstPair(inner, visual)
  " In case we already are in visual mode, we may have to extend the current
  " zone if it selects a pair of brackets
  if a:visual
    let char_b = lh#position#char_at_mark("'<")
    if char_b =~ s:k_begin
      \ && s:k_pairs[char_b] == lh#position#char_at_mark("'>")
      call search('.', 'bW') " previous char
    elseif a:inner
      " handle case the case "vi%i%i%"
      let current_pos = getpos('.')
      call setpos('.', getpos("'<"))
      call search('.', 'bW') " previous char
      let pos_b = getpos('.')
      call setpos('.', getpos("'>"))
      call search('.', 'W') " next char
      let pos_e = getpos('.')
      let char_b = lh#position#char_at_pos(pos_b)
      let char_e = lh#position#char_at_pos(pos_e)
      echomsg "chars = ".char_b.char_e
      if char_b =~ s:k_begin
        \ && s:k_pairs[char_b] == char_e
    call setpos('.', pos_b) " restore start_pos
    call search('.', 'bW') " previous char
      else
    call setpos('.', current_pos) " restore init_pos
      endif
    endif
  endif

  " Searching the n outer blocks requested
  let cnt = v:count <= 0 ? 1 : v:count
  while cnt > 0
    let cnt -= 1
    let char_c = lh#position#char_at_pos(getpos('.'))
    let accept_at_current = char_c =~ s:k_begin ? 'c' : ''

    " Begin of the current outer block
    if 0 ==searchpair(s:k_begin, '', s:k_end, 'bW'.accept_at_current, 'lh#syntax#skip()')
      throw "No outer bloc"
    endif
    if cnt > 0
      call search('.', 'bW') " previous char
    endif
  endwhile

  let char_b = lh#position#char_at_pos(getpos('.'))

  normal! v

  " End of the outer block
  let pos_e = searchpair(s:k_begin, '', s:k_end, 'W', 'lh#syntax#skip()')
  let char_e = lh#position#char_at_pos(getpos('.'))
  if pos_e == 0
    throw "pos_e == 0"
  elseif s:k_pairs[char_b] != char_e
    echomsg "unbalanced blocks"
  endif

  " Adjusting the extremities
  if a:inner
    call search('.', 'b')
    normal! o
    call search('.')
    normal! o
  endif
endfunction
" Private Functions }}}1

Lưu ý: Tôi đã sử dụng lại chức năng từ lh-vim-lib - BTW, có một lỗi nhỏ trong phiên bản lh#position#char_at_pos()in conf: col()không được sử dụng.


Tôi nhận được một lỗi cú pháp với mã của bạn: line 13: E15: Invalid expression: E15: Invalid expression: {(Hoài). Tôi có vim 7.2, mã của bạn có cần 7.3 không? Nhân tiện, trong khi các câu hỏi lập trình thường được chuyển hướng đến SO, câu trả lời kịch bản (cho shell, trình soạn thảo và các chương trình scriptable khác) là phổ biến ở đây.
Gilles 'SO- ngừng trở nên xấu xa'

Bạn có vim hỗ trợ từ điển? Nếu có, điều gì xảy ra nếu bạn thêm set cpo&vimvào lúc bắt đầu tập lệnh - đã được thử nghiệm và phát triển trên phiên bản 7.2.148 trên ... Windows XP. (Tôi hơi mệt mỏi với sự phân tán của cộng đồng vim này, hãy xem các nhận xét về câu trả lời này stackoverflow.com/questions/4488979/
mẹo

Cảm ơn! Làm thế nào để tôi gọi nó? Tôi đã thử sử dụng bcho tất cả các khối nhưng nó vẫn chỉ chọn ()loại khối. Tôi có phải gọi nó khác đi không, hay tôi đã cài đặt sai?
Goran Jovic

ibđã có nghĩa là một cái gì đó. Bạn sử dụng cái này với i%hoặc a%(xem ánh xạ) => di%, va%i%, c2a%, vv
Luc Hermitte

1

Không theo mặc định, nhưng có thể có một số cơ chế để thêm chức năng đó. Trong visual.txt, phần về hoạt động trên khu vực trực quan, nó có phần này:

The objects that can be used are:
    aw      a word (with white space)                       |v_aw|
    iw      inner word                                      |v_iw|
    aW      a WORD (with white space)                       |v_aW|
    iW      inner WORD                                      |v_iW|
    as      a sentence (with white space)                   |v_as|
    is      inner sentence                                  |v_is|
    ap      a paragraph (with white space)                  |v_ap|
    ip      inner paragraph                                 |v_ip|
    ab      a () block (with parenthesis)                   |v_ab|
    ib      inner () block                                  |v_ib|
    aB      a {} block (with braces)                        |v_aB|
    iB      inner {} block                                  |v_iB|
    at      a <tag> </tag> block (with tags)                |v_at|
    it      inner <tag> </tag> block                        |v_it|
    a<      a <> block (with <>)                            |v_a<|
    i<      inner <> block                                  |v_i<|
    a[      a [] block (with [])                            |v_a[|
    i[      inner [] block                                  |v_i[|
    a"      a double quoted string (with quotes)            |v_aquote|
    a'      a single quoted string (with quotes)            |v_a'|
    i'      inner simple quoted string                      |v_i'|
    a`      a string in backticks (with backticks)          |v_a`|
    i`      inner string in backticks                       |v_i`|

0

Có một addon vim gọi là textobj-user hỗ trợ .. ừm, đại loại như thế này. Trên thực tế tôi không chắc tôi đã hiểu những gì bạn đang tìm kiếm, nhưng tôi nghĩ rằng addon có nghĩa là để thuận tiện hơn khi viết một addon để thực hiện những gì bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.