Come posso gestire e ricordare molte abbreviazioni nel mio vimrc?


10

Ho oltre 500 abbreviazioni ( iabbr, abbr) e alcune mappature nel mio file vimrc da Java, PHP, C / C ++ e Latex.

Non è facile ricordare subito quando non uso le lingue da un po 'di tempo.

Mi chiedo se posso completare il nome dell'abbreviazione. Esiste un modo migliore per accedere / gestire tutte queste abbreviazioni?

Risposte:


10

Non so quale sia il modo migliore per gestire oltre 500 abbreviazioni. Forse a lungo termine, come spiegato da @statox, potresti dare un'occhiata agli snippet per ridurre questo numero.

E se vuoi completare automaticamente le abbreviazioni, puoi provare il seguente codice:

augroup GetAbbrev
    autocmd!
    autocmd VimEnter * let s:abbrev_list = [] |
                \ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END

set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
    if a:findstart
        return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
    else
        return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
    endif
endfunction

Per usarlo, dovresti premere C-x C-udopo l'inizio di un'abbreviazione.


Autocmd imposta la variabile s:abbrev_listche dovrebbe contenere tutte le abbreviazioni.

La funzione CompleteAbbrev()dovrebbe restituire un elenco di candidati basato sulla parola prima del cursore.

Il 'completefunc'valore dell'opzione indica a Vim quale funzione chiamare quando si preme C-x C-u.
Si noti che l'opzione è locale per il buffer, quindi è comunque possibile utilizzare altre funzioni in diversi tipi di buffer, usando ad esempio un autocmd e l' FileTypeevento.

Vedi :h complete-functionsper maggiori informazioni su come funziona la funzione.


Un'altra soluzione sarebbe quella di utilizzare il completamento dei sinonimi. Da :h i_^x^t:

                            *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T       Works as CTRL-X CTRL-K, but in a special way.  It uses
                    the 'thesaurus' option instead of 'dictionary'.  If a
                    match is found in the thesaurus file, all the
                    remaining words on the same line are included as
                    matches, even though they don't complete the word.
                    Thus a word can be completely replaced.

                    For an example, imagine the 'thesaurus' file has a
                    line like this:
                            angry furious mad enraged
                    Placing the cursor after the letters "ang" and typing
                    CTRL-X CTRL-T would complete the word "angry";
                    subsequent presses would change the word to "furious",
                    "mad" etc.
                    Other uses include translation between two languages,
                    or grouping API functions by keyword.

Per utilizzare questa soluzione, dovresti fare 3 cose:

  1. Scrivi {lhs}tutte le tue abbreviazioni in un file dedicato.
    Ad esempio /home/user/mysynonyms.txt,. E raggruppali attorno a temi simili.
  2. Aggiungi il percorso a questo file all'opzione 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Premi C-x C-tdopo l'inizio del nome di qualsiasi abbreviazione all'interno di un gruppo.

Ad esempio, supponiamo di avere le seguenti abbreviazioni:

iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC

iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC

iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC

Potresti raggrupparli in base al linguaggio di programmazione a cui appartengono.
All'interno /home/user/mysynonyms.txt, dovresti scrivere:

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

Ora, ogni volta che si preme C-x C-tdopo il nome di un'abbreviazione (o solo l'inizio), Vim dovrebbe visualizzare, nel menu a comparsa, tutte le abbreviazioni che si trovano sulla stessa riga.

Ecco come sarebbe:

inserisci qui la descrizione dell'immagine

Nota che le abbreviazioni non devono necessariamente iniziare con gli stessi caratteri per essere raggruppate, potrebbero essere completamente diverse. Finché si trovano sulla stessa riga nel file dei sinonimi, Vim mostrerà tutti.

E non devi usare il linguaggio di programmazione per decidere in quale gruppo inserire un'abbreviazione. Potresti raggrupparli in base a qualsiasi somiglianza / argomento / categoria significativa che hai in mente.

Quindi, quando si dimentica un'abbreviazione specifica, è possibile digitare le prime lettere di una categoria, C-x C-tpremere e scegliere quella pertinente all'interno del menu.

Modifica:
per scaricare tutte le abbreviazioni all'interno /home/user/mysynonyms.txt, è possibile utilizzare questi 3 comandi Ex:

:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')

Edit2:
ho aggiunto il flag nquando substitute()viene chiamata la funzione perché non è necessaria alcuna sostituzione. Il suo unico scopo è quello di aggiungere un'abbreviazione all'interno di un elenco ogni volta che ne viene trovata una.
Ma poiché hai molte abbreviazioni, potrebbe rallentare inutilmente il processo, non lo so. Inizialmente, non l'ho messo perché non so quale versione di Vim stai usando. Se la tua versione è più recente della 7.3.627 , dovrebbe essere ok, altrimenti dovresti rimuovere il nflag.


risposta fantastica e completa. tu Rock
1234,

\ v% (^ | \ n) \ s * i% (nore) ab% [brev] \ s +% (% (\ <espr \> | \ <buffer \>) \ s +)?? {2} ( \ k +) non funziona sul mio file vimrc
1234,

@JoobLee Funziona sul mio sistema, hai qualche messaggio di errore? Funziona con un regex più semplice (ma meno affidabile) \vi?abbr\s+(\k+)? Potresti darmi un link con un estratto delle tue abbreviazioni, per vedere se riesco a riprodurre il tuo problema?
user9433424,

@JoobLee Se la tua versione di Vim è abbastanza recente, aggiungi il nflag alla chiamata sostitutiva (ho modificato la risposta per includerla). Se fai una ricerca nel tuo vimrce lo incolli \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, evidenzia le tue abbreviazioni?
user9433424,

9

Un suggerimento wikia suggerisce un metodo per visualizzare selettivamente le abbreviazioni:

Puoi elencare tutte le tue abbreviazioni con

:ab<CR>

(sostituisci abcon iabper elencare solo le abbreviazioni della modalità di inserimento)

E puoi elencare tutte le abbreviazioni con lo stesso prefisso con

:ab prefix<CR>

Questo non è l'ideale come un completamento delle abbreviazioni, ma potrebbe essere un buon modo per avere rapidamente un elenco delle abbreviazioni esistenti.

Per rendere questa soluzione più efficiente, una buona pratica sarebbe quella di creare abbreviazioni specifiche per un tipo di file. Ad esempio questa abbreviazione è utile solo in un buffer java:

iabbrev syso System.out.println("");

Quindi è bene definirlo in questo modo:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

La parte autocommand consente di creare l'abbreviazione solo quando ci si trova in un buffer java e l' <buffer>opzione rende l'abbreviazione accessibile solo da questo buffer.

In questo modo :iabverrà visualizzata l'abbreviazione solo quando ci si trova in un buffer Java. Se hai molte abbreviazioni, potrebbe essere interessante creare una funzione per tipo di file che definisca tutte le abbreviazioni e consenta al comando automatico di chiamare la funzione. Qualcosa di simile a:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

Un'altra soluzione potrebbe essere quella di creare la tua funzione di completamento automatico usando un elenco della tua abbreviazione come fonte di parole chiave.

Infine, devo dire che sono piuttosto colpito dalle "oltre 500 abbreviazioni", non so quali stai usando, ma forse sarebbe interessante per te dare un'occhiata al concetto di frammenti se non hai familiarità con loro. Poiché sono modelli che vengono attivati ​​immettendo una parola chiave e premendo un tasto di scelta rapida, sono più flessibili delle abbreviazioni, potrebbe consentire di ridurre il numero di abbreviazioni che si stanno utilizzando. Vedi qui per un'introduzione interessante.


1

Che ne dici di raggruppare le abbreviazioni per tipo di file?

Invece di averli tutti nel tuo ~/.vimrcfile, suddividili e inseriscili nelle posizioni appropriate nella tua directory di runtime, che si trova ~/.vimsu sistemi operativi simili a Unix.

Ad esempio, le abbreviazioni di Markdown si troverebbero nel file ~/.vim/after/ftplugin/markdown.vim, che Vim controlla dopo il caricamento del plug-in del tipo di file Markdown.

Si scopre che non dovremmo avere .vimrcfile enormi ; ottieni maggiore flessibilità usando $VIMRUNTIME. Il percorso di runtime è documentato nel sistema di help di Vim: :h 'runtimepath'.

L'ho imparato per la prima volta dall'eccellente articolo Da .vimrc a .vim sul calendario dell'avvento a tema Vim Vimways .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.