2012-01-24 4 views
3

Je crée souvent un mappage temporaire pour faire quelque chose sur un fichier particulier.Achèvement du fichier lors du mappage des commandes dans VIM

exemple typique est la suivante:

:map <leader>f :w<cr>:! bundle exec cucumber features/account/sign_in.feature:41<cr> 

Je veux que le fichier features/account/sign_in.feature à autocompleted à partir du répertoire courant.

Cela devrait simplement enregistrer le fichier en cours et sortir sur <leader>f pour exécuter la commande.

Il me permet de facilement travailler sur un morceau de code ne pas penser à sauter à un fichier particulier et exécutez-le.

Le problème est que la création d'une telle liaison est lourde et erreur sujette à.

VIM n'autorise pas à compléter le nom de fichier lors du mappage. Également utiliser % est totalement différent (je veux mapper à un fichier statiquement).

Quelle est la meilleure façon de le faire?

Merci.

+1

Désolé, ce n'est pas clair du tout, quel nom de fichier vous voulez compléter. D'où vient le ': 41'? – sehe

+0

J'ai mis à jour la question. Je veux compléter automatiquement 'features/account/sign_in.feature'. Le 41 n'a pas d'importance (c'est le numéro de ligne dans le fichier). –

+0

Et où voulez-vous le 'compléter' (le mot _completion_ suggère que vous avez une partie, et le reste doit être _appended automatiquement_; achèvement de nom de fichier implique généralement regarder les noms de fichiers possibles et sélectionner le nom d'un fichier existant accessible) – sehe

Répondre

3

Allthough Je pense que votre question devrait être beaucoup plus clair, voici quelques conseils:

:nnoremap <leader>f :w<bar>!exec "bundle exec cucumber " . expand('%') . ":" . line('.')<CR> 

CORRECTEMENT enregistrer et insérer le numéro actuel nom de fichier/ligne dans la commande

De plus, vous voulez savoir sur l'option autowrite:

:se autowrite 

Enfin, j'emploie habituellement makeprg pour ce genre de but:

:let &makeprg="bundle exec cucumber %" 

Cela a l'avantage de travailler avec des commandes de quickfix (:copen, :colder, :cnewer) et (donné une makef correcte) aussi sauter à des lignes d'erreur

+0

Bon à savoir sur 'autowrite'. Merci. Pouvez-vous s'il vous plaît développer un peu plus sur la façon d'utiliser 'makeprg' ici? –

+0

@DmytriiNagirniak: Oui, j'ai déjà montré comment le régler. Je vous suggère de l'essayer en faisant ': make | copen' (et': help quickfix' pour une documentation complète sur toutes les commandes quickfix) – sehe

+0

Pourquoi ai-je besoin de taper ': make | copen' si j'appuie juste' f' plus rapide? Je veux juste avoir un raccourci pour la commande (qui est souvent différente, ce n'est pas un compilateur ou similaire). Le mappage de cette commande est juste sujette aux erreurs. –

1

Je ne connais pas la réponse, mais si je étiez-vous j'utiliserais cabbr:

:cabbr fas features/account/sign_in.features: 

Ou quelque chose comme ça. Ce n'est pas une saisie semi-automatique, mais cela réduit certainement le nombre de frappes dont vous avez besoin.

Une autre alternative consiste à créer une fonction mappée à partir d'une commande utilisateur qui accepte un argument qui crée le mappage. Si je me souviens bien, vous pouvez personnaliser l'achèvement de la commande utilisateur afin que cela fonctionne.

Mise à jour: Oui, vous pouvez personnaliser la commande utilisateur.Voir :help user-command

Quelque chose comme cela devrait vous aider à démarrer:

command -complete=file_in_path -nargs=1 Map call CreateMap(expand('<args>')) 

function CreateMap(filename) 
    exec 'map <leader>f :w<cr>:! bundle exec cucumber ' . a:filename . ':41<cr>' 
endfun 

Une fois que vous faites cela, assurez-vous que vous « chemin » paramètre comprend le répertoire courant, ou si vous voulez faire la recherche récursive « » "./**". Ensuite, vous pouvez utiliser la commande utilisateur Map comme ceci:

:Map fea<tab>ac<tab>