2011-02-12 8 views
37

En mi plugin de vim, tengo dos archivos:Como llegar a la ruta Vimscript actual que está siendo ejecutado

myplugin/plugin.vim 
myplugin/plugin_helpers.py 

me gustaría importar plugin_helpers de plugin.vim (utilizando el soporte de vim Python), por lo que Creo que primero necesito poner el directorio de mi complemento en sys.path de Python.

¿Cómo puedo (en vimscript) obtener la ruta al script en ejecución? En python, esto es __file__. En ruby, es __FILE__. No pude encontrar nada similar para vim buscando en Google, ¿se puede hacer?

Nota: yo no estoy buscando el archivo actualmenteeditados ("%: p" y amigos).

+0

Fuente de ruta relativa a el script actual: 'execute 'source'. expandir (': p: h'). '/ another.vim'' –

Respuesta

53
" Relative path of script file: 
let s:path = expand('<sfile>') 

" Absolute path of script file: 
let s:path = expand('<sfile>:p') 

" Absolute path of script file with symbolic links resolved: 
let s:path = resolve(expand('<sfile>:p')) 

" Folder in which script resides: (not safe for symlinks) 
let s:path = expand('<sfile>:p:h') 

" If you're using a symlink to your script, but your resources are in 
" the same directory as the actual script, you'll need to do this: 
" 1: Get the absolute path of the script 
" 2: Resolve all symbolic links 
" 3: Get the folder of the resolved absolute file 
let s:path = fnamemodify(resolve(expand('<sfile>:p')), ':h') 

uso esa última menudo porque mi ~/.vimrc es un enlace simbólico a una secuencia de comandos en un repositorio git.

+2

Gracias! La pregunta ya fue respondida por mucho tiempo, pero tomaré esta ahora ya que la información adicional es probable que sea útil. – gfxmonk

32

lo encontró:

let s:current_file=expand("<sfile>") 
+14

En caso de que ayude a alguien más. Asegúrese de hacer esto en el ámbito de nivel superior. Si intenta ejecutarlo dentro de una función, terminará obteniendo el nombre de la función en lugar de la ruta al archivo que contiene la función. –

+3

Me sorprende lo difícil que fue encontrar esta información en Internet, ¡muchas gracias! –

+1

': p' para una ruta absoluta. ': p: h' para el directorio en el que reside el script. – Zenexer

7

Vale la pena mencionar que la solución anterior solo funcionará fuera de una función.

Esto no dará el resultado deseado:

function! MyFunction() 
let s:current_file=expand('<sfile>:p:h') 
echom s:current_file 
endfunction 

pero esto:

let s:current_file=expand('<sfile>') 
function! MyFunction() 
echom s:current_file 
endfunction 

Aquí es una solución completa a la pregunta original de OP:

let s:path = expand('<sfile>:p:h') 

function! MyPythonFunction() 
import sys 
import os 
script_path = vim.eval('s:path') 

lib_path = os.path.join(script_path, '.') 
sys.path.insert(0, lib_path)          

import vim 
import plugin_helpers 
plugin_helpers.do_some_cool_stuff_here() 
vim.command("badd %(result)s" % {'result':plugin_helpers.get_result()}) 

EOF 
endfunction 
+0

¡Gracias! Después de leer algunas 'fuentes', esto finalmente me dio suficiente información para hacerlo bien. Lo usé en ruby, y uso 'load' en lugar de' require' para volver a cargar el script cada vez, lo que hace que sea mucho más fácil cuando realizo cambios en la lib. –

Cuestiones relacionadas