tùy chọn `set` với các biến


8

Tôi đang cố gắng viết lại thêm một chuỗi vào tùy chọn với biến. Chuỗi ban đầu là

set rtp+=~/.vim/bundle/Vundle.vim

Sau đây là letcách làm việc :

let MYVIMDIR='/home/loom/foo'
let &rtp .= ','.expand(MYVIMDIR).'/bundle/Vundle.vim'

Tôi quan tâm làm thế nào để viết lại nó với set. Đoạn mã sau (và một số biến thể khác) không hoạt động

let MYVIMDIR='/home/loom/foo'
set rtp+=expand(MYVIMDIR).'/bundle/Vundle.vim'

Cách đúng để sử dụng các biến trong biểu thức là setgì?

Câu trả lời:


9

Bạn có thể sử dụng :exe, nhưng điều này cực kỳ cồng kềnh khi sử dụng và bạn sẽ cần phải thoát khỏi một vài điều.

Tôi đã từng sử dụng chức năng sửa đường dẫn của riêng tôi. Nó trông giống như:

exe 'set rtp+='.lh#path#fix(somevariable)
" with standard tools, may be it'd be (untested)
exe 'set rtp+='.escape(somevariable, ' \|,')

let &rtp = expression thực sự là bạn của chúng tôi

Nhưng thực sự, nó không chơi tốt với +=. Đó là lý do tại sao tôi nghĩ ra lh#path#munge()điều đó phụ thuộc vào chức năng khác lh#list#add_if_new(). Nói đúng ra set +=là giả lập bởi lh#list#add_if_new(). munge()giữ các tên đường tồn tại hoặc các mẫu hình thực sự phù hợp với sự vật.

" Function: lh#path#munge(pathlist, path) {{{3
function! lh#path#munge(pathlist, path) abort
  if type(a:pathlist) == type('str')
    let pathlist = split(a:pathlist, ',')
    return join(lh#path#munge(pathlist, a:path), ',')
  else
    " if filereadable(a:path) || isdirectory(a:path)
    if ! empty(glob(a:path)) " support '/**' for &tags
      call lh#list#push_if_new(a:pathlist, a:path)
    endif
    return a:pathlist
  endif
endfunction

" Function: lh#list#push_if_new(list, value) {{{3
function! lh#list#push_if_new(list, value) abort
  if index(a:list, a:value) < 0
    call add (a:list, a:value)
  endif
  return a:list
endfunction

Chúng được định nghĩa và duy trì trong lh-vim-lib .


1
bạn cũng cần thoát dấu phẩy trong: thiết lập cuộc gọi
Christian Brabandt

4

Bạn có thể sử dụng một biến môi trường được xác định trong phiên shell hiện tại của bạn.

let $myvimdir = '/home/abc/vimfiles'

Bằng cách đó, bạn có thể sử dụng các biến khác để tạo đường dẫn:

let $myvimdir = $HOME.'/vimfiles'

Và thiết lập đường dẫn thời gian chạy:

set rtp+=$myvimdir/bundle/Vundle.vim

Thông tin thêm về các biến môi trường trong vim : help expr-env


1
Hấp dẫn. Nhưng khi tôi thử let $nts | set ts=$nts, vim không thích nó.
tivn

Đó là bởi vì các biến môi trường được lưu trữ dưới dạng chuỗi và tabstop đang mong đợi một số.
iznav
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.