2010-02-17 21 views
34

Ho un piccolo problema con "tab size" e diversi progetti, alcuni come 2 o 4 e il kernel Linux come 8 spazi per scheda.Come utilizzare le variabili nel mio .vimrc?

E questo non è un grosso problema dato che posso solo cambiare un paio di impostazioni nel mio Vimrc

set tabstop=4 
set shiftwidth=4 
set softtabstop=4 

ma che è 3 linee che ho bisogno di cambiare ...

Sarebbe bello avere una linea con una variabile con il numero 2,4 o 8.

un po 'come

let l:tabsize=4 
set tabstop=l:tabsize 
set shiftwidth=l:tabsize 
set softtabstop=l:tabsize 

Ma questo non funziona ...

Sai come risolvere questo?

Grazie Johan


Aggiornamento: Questo risolve il mio piccolo problema.

let tabsize = 4 
execute "set tabstop=".tabsize 
execute "set shiftwidth=".tabsize 
execute "set softtabstop=".tabsize 
+0

Vedere anche le risposte in [Tab Vs Space preferences in Vim] (http://stackoverflow.com/q/1562336). – glts

risposta

23

non è possibile utilizzare le variabili sulle RHS nel .vimrc.

provare: help-list per ulteriori informazioni. per UNIX vs finestre per esempio (non so cosa i vostri progetti sono):

if has("unix") 
    " do stuff for Unix 
elseif has("win32") 
    " do stuff for Windows 
endif 

potrebbe funzionare, o di altri esempi sono

let &path = g:desktop_path 

o

execute "set path=".g:desktop_path 

Se g: desktop_path contiene spazi , dovrai sfuggire a quelli, nell'impostazione originale di g: desktop_path o quando si imposta 'path', ad esempio,

execute "set path=".escape(g:desktop_path, ' ') 

Vedi

:help let-option 
:help execute 
:help escape() 
+0

Soluzione accettata poiché hai fornito un esempio di sintassi "esegui" ... era la parte mancante. – Johan

+0

Inoltre, 'let & path = g: desktop_path' non funziona; solo l'approccio 'execute' – JESii

7

Questo è il lavoro:

let my_sw = 20 
let &sw = my_sw 

Ora si può capire come risolvere il codice

+0

Questo è corretto. –

+0

Per coloro che sono curiosi di questa sintassi, puoi visitare [questa pagina] (http://learnvimscriptthehardway.stevelosh.com/chapters/19.html). In breve, 'my_sw' è una variabile dichiarata da noi, e possiamo prefiex un' & 'alle opzioni built-in per utilizzarle come variabili, come' & sw' qui. – VicX

4

Questa soluzione non fa uso di variabili locali, ma sarà ottenere il risultato desiderato utilizzando solo il file .vimrc. Basta aggiungere il codice sottostante al tuo file .vimrc e aggiungere ulteriori opzioni specifiche del progetto (anche mappature) alle funzioni corrispondenti di seguito. (Ricordarsi di modificare i percorsi di globbing nelle linee autocmd! nel nome della cartella appropriata.)

autocmd! BufReadPost,BufNewFile */myProject/** call <SID>MyProjectOptions() 
autocmd! BufReadPost,BufNewFile */linux-kernel/** call <SID>LinuxKernelOptions() 

function! <SID>MyProjectOptions() 
    " everything in this function only applies to myProject files 
    setlocal tabstop=4 
    ... 
endfunction 

function! <SID>LinuxKernelOptions() 
    " everything in this function only applies to linux kernel files 
    setlocal tabstop=8 
    ... 
endfunction 
+0

Cool questo potrebbe funzionare :) – Johan

1

Ecco una battuta che alterna colorcolumn on/off quando si colpisce il leader + C:

nnoremap <Leader>c :execute "set colorcolumn=" . (&cc == "+1" ? "0" : "+1")<CR> 
1

Sono stato turbato da questo problema per un molto lungo, troppo . Questo è particolarmente doloroso quando devo lavorare contemporaneamente con il codice di altre persone, il che mi costringe a cambiare frequentemente la dimensione del rientro. Avevo qualcosa di simile alla soluzione dell'OP, ma questo richiede comunque l'aggiornamento del file .vimrc ogni volta. Più tardi, ho imparato che posso solo definire tale funzione che potrei chiamare dall'editor:

function! SetTabSize(size) 
    execute "set tabstop=".a:size 
    execute "set shiftwidth=".a:size 
    execute "set softtabstop=".a:size 
endfunction 
command! -nargs=1 Sts call SetTabSize(<f-args>) 

In l'editor, se si desidera modificare la dimensione di rientro corrente a 4, basta fare:

:Sts 4 

Spero che questo aiuti.

+0

Non hai più bisogno di una funzione: la recente versione di vim supporta valori speciali di' shiftwidth' e 'softtabstop' che fanno sì che seguano il valore' tabstop' ('softtabstop') seguirà 'shiftwidth' che seguirà' tabstop', non qualcosa di più semplice in quanto entrambi seguono 'tabstop'). Vedi la mia risposta. – ZyX

6

Dato che l'argomento è stato portato di nuovo alla vita qui sono i miei pochi bit:

" In the vimrc 
set softtabstop=-1 " Make 'softtabstop' follow 'shiftwidth' 
set shiftwidth=0 " Make 'shiftwidth' follow 'tabstop' 

" Somewhere else 
let &tabstop=l:tabsize " Assign 'tabstop' a value of local tabsize variable 
" or, typed manually 
set ts=4 

. E per favore dimenticati di execute 'set option='.var. let &option=var disponibile almeno dal vim-7.0.

Problemi correlati