2010-01-10 5 views
14

J'ai la mauvaise habitude d'utiliser la touche "home" pour revenir au début d'une ligne. Comme j'ai récemment commencé à utiliser vim, j'ai remarqué que lorsque j'appuie sur la touche home d'une ligne en retrait, cela me ramène au tout début de la ligne. Dans Notepad ++ (l'éditeur que j'avais l'habitude d'utiliser) il me retournerait au début du code sur cette ligne, juste après le retrait.Appuyer sur "Home" dans Vim sur une ligne indentée

Existe-t-il un moyen de répliquer ce comportement dans vim? Habituellement, quand j'appuie sur la maison, c'est en mode Insertion pour que j'y mette (habituellement) une variable.

Je set smartindent dans mon vimrc, avec set noautoindent comme page « conseils » m'a dit de vous assurer de désactiver autoindent (bien qu'il ne semble pas être activé en premier lieu -. Peut-être cette option est étrangère)

Répondre

26

Il y a deux façons habituelles d'aller au « début » d'une ligne dans vim:

  • (zéro) aller à la première colonne de texte
  • ^ aller à la première non-espaces blancs sur la ligne

Je trouve que l'utilisation w est généralement le moyen le plus pratique pour moi d'aller au premier caractère non vide sur une ligne, c'est le même nombre de clés que ^ et est e asier à atteindre. (Bien sûr, s'il n'y a pas d'espaces au sur la ligne, ne pas appuyer sur w.)

+1

Donc, aucun moyen de le faire en mode insertion? Je suppose que je devrais m'habituer à échanger entre les deux. – Reid

+0

Je ne pense pas qu'il y ait un moyen; Je n'utilise pas du tout le mouvement du curseur en mode insertion. Cet article pourrait être utile: http://www.viemu.com/a-why-vi-vim.html –

+0

@Reid - Vous pourriez probablement le mapper d'une manière ou d'une autre (voir ci-dessous) - mais tout mouvement devrait vraiment être fait en mode N, pas I. – Rook

1

Essayez d'appuyer sur 0 (voir aussi :help 0)

aussi, cela pourrait aider:

:imap <C-Home> <esc>0a 
13

Vous pouvez remapper Accueil être le même que ^ (les docs disent Accueil « s fonction par défaut est équivalent à la commande de mouvement |):

:map <Home>^ 
:imap <Home> <Esc>^i 

qui devrait être le mappage du mode d'insertion équivalent à échapper du mode d'insertion , en appuyant sur ^, puis revenez en mode insertion. Je ne connais pas la meilleure méthode de mappage d'une commande de mouvement pour l'utiliser en mode insertion, donc cela peut casser quelque chose, mais cela semble fonctionner. En ce qui concerne vos paramètres d'indentation, ils ne devraient pas avoir d'effet sur les contrôles de mouvement, mais je pense aussi que vous préféreriez probablement les régler différemment. autoindent garde juste votre indentation courante pour les nouvelles lignes (donc si vous placez 4 espaces au début d'une ligne, après avoir appuyé sur retour, votre nouvelle ligne aura aussi 4 espaces placés devant). Je ne sais pas pourquoi vous ne le voudriez pas, car c'est très utile dans presque tous les langages de programmation, ou même simplement en format libre. D'autre part, smartindent implémente deux règles d'indentation C-ish légèrement codées en dur, comme indenter après une ouverture {, et désindenser après une fermeture}, mais ne transfère pas automatiquement l'indentation des lignes précédentes. Les docs recommandent de garder l'index automatique si vous utilisez smartindent.Smartindent est inutile pour les langages qui ne respectent pas ses règles codées en dur, ou qui sont activement nuisibles (comme quand il supprime automatiquement l'indentation de toute ligne commençant par un '#', qu'il pense être une directive de préprocesseur mais est faux pour les programmeurs python qui essaient d'écrire un commentaire en retrait). Par conséquent, vim inclut également un mode d'indentation plus avancé, l'indentation des types de fichiers, qui autorise des règles d'indentation flexibles par langue/type de fichier et constitue le mode d'indentation préféré pour la plupart des gens (même pour les langages C). Si vous utilisez l'indentation de type de fichier, il est préférable de désactiver smartindent (sinon, il peut interférer avec l'indentation de type de fichier, comme le déplacement de toutes les lignes de commentaire vers la colonne 0 dans les fichiers python).

Personnellement, je suis toujours autoindent sur, utilisez le type de fichier lorsque disponible, et n'utilisez jamais smartindent. Mon Vimrc comprend:

set autoindent " doesn't interfere with filetype indents, and is useful for text 
if has("autocmd") 
    " Enable file type detection and indentation 
    filetype plugin indent on 
    set nosmartindent 
endif 

J'imagine qu'il ya quelque chose que vous pouvez faire pour avoir smartindent activé que lorsque filetype n'existe pas indenter pour un type de fichier, si vous éditez que de nombreux langages de type C sans Indentation de type de fichier disponible.

+1

vous pouvez réduire la carte de mode d'insertion par un caractère en disant 'imap I' au lieu de'^i' –

7

Voici ce que j'ai dans mon .vimrc. Cette cartes Accueil pour déplacer au début du texte si vous êtes n'importe où dans la ligne, et la colonne 0 si vous êtes au début du texte.

function ExtendedHome() 
    let column = col('.') 
    normal!^
    if column == col('.') 
     normal! 0 
    endif 
endfunction 
noremap <silent> <Home> :call ExtendedHome()<CR> 
inoremap <silent> <Home> <C-O>:call ExtendedHome()<CR> 

Note: J'utilise une disposition de clavier qui mappe Accueil à Alt Gr +A, ce pourquoi j'utilise cela. Si vous devez quitter le champ alphabétique de votre clavier pour atteindre Home, vous devriez probablement passer en mode normal.

2

Vous pouvez également utiliser _ en mode Normal pour accéder au premier caractère non-espace de la ligne en cours. Vous pouvez également utiliser un compte avec cette motion.

_ <underscore>  [count] - 1 lines downward, 
        on the first non-blank character linewise. 
Questions connexes