vimrcの多くの略語をどのように管理および記憶しますか?


10

500を超える略語(iabbrabbr)と、Java、PHP、C / C ++、およびLatexからのvimrcファイルにいくつかのマッピングがあります。

言語をしばらく使用しないと、すぐに覚えるのは簡単ではありません。

略語名で補完できるか迷っています。これらのすべての略語にアクセス/管理するためのより良い方法はありますか?

回答:


10

500以上の略語を管理するための最良の方法はわかりません。おそらく長期的には、@ statoxが説明したように、スニペットを見てこの数を減らすことができます。

また、略語を自動補完したい場合は、次のコードを試すことができます。

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

それを使用するにC-x C-uは、略語の始めの後でヒットする必要があります。


autocmd s:abbrev_listは、すべての省略形を含む変数を設定します。

関数CompleteAbbrev()は、カーソルの前の単語に基づいて候補のリストを返す必要があります。

'completefunc'オプションの値は、あなたが打つときに呼び出す機能Vimを伝えますC-x C-u
オプションはバッファに対してローカルであるため、FileTypeたとえばautocmdやイベントを使用するなど、別の種類のバッファで他の関数を引き続き使用できることに注意してください。

:h complete-functions関数の動作の詳細については、を参照してください。


別の解決策は、シノニム補完を使用することです。から: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.

このソリューションを使用するには、3つのことを行う必要があります。

  1. {lhs}すべての略語を専用のファイルに書き込みます。
    たとえば、/home/user/mysynonyms.txt。そして、それらを同様のテーマでグループ化します。
  2. このファイルへのパスをオプションに追加します'thesaurus'

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. C-x C-tグループ内の任意の略語の名前の先頭の後にヒットします。

たとえば、次の略語があるとします。

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

それらが属するプログラミング言語に従ってそれらをグループ化できます。
内部では/home/user/mysynonyms.txt、次のように記述します。

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

これC-x C-tで、略語の名前の直後(またはその最初)を押すと、Vimはポップアップメニューに同じ行にあるすべての略語を表示するはずです。

これは、次のようになります。

ここに画像の説明を入力してください

略語は、グループ化するために同じ文字で始める必要はないことに注意してください。それらは完全に異なる場合があります。同義語ファイルの同じ行にある限り、Vimはそれらすべてを表示します。

また、どのグループに略語を使用するかを決定するためにプログラミング言語を使用する必要はありません。考えている意味のある類似性/トピック/カテゴリに従ってグループ化できます。

したがって、特定の略語を忘れた場合は、カテゴリの最初の文字を入力しC-x C-t、メニュー内で該当するものを押して選択できます。

編集:
内のすべての略語をダンプ/home/user/mysynonyms.txtするには、次の3つの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:置換が必要ないため、関数が呼び出されたとき
にフラグを追加しました。その唯一の目的は、リストに略語が見つかるたびにその中に略語を追加することです。 しかし、多くの略語があるため、プロセスが無用に遅くなる可能性があるとは思いません。最初は、使用しているVimのバージョンがわからないので入れませんでした。バージョンが7.3.627より新しい場合は問題ありませんが、そうでない場合はフラグを削除する必要があります。nsubstitute()
n


幻想的で包括的な答え。ユー・ロック
1234年

\ v%(^ | \ n)\ s * i?%(nore)?ab%[brev] \ s +%(%(\ <expr \> | \ <buffer \>)\ s +){、2}( \ k +)が私のvimrcファイルで機能しない
1234

@JoobLeeこれは私のシステムで動作しますが、エラーメッセージはありますか?より単純な(しかし信頼性は低い)正規表現で動作し\vi?abbr\s+(\k+)ますか?問題を再現できるかどうかを確認するために、省略形の抜粋とのリンクを教えていただけませんか。
user9433424 2016年

@JoobLee Vimのバージョンが十分に新しい場合はn、代替呼び出しにフラグを追加します(これを含めるように回答を編集しました)。で検索を実行し、vimrcこれをコピーして貼り付ける\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+と、略語が強調表示されますか?
user9433424 2016年

9

wikiaのヒントでは、略語を選択的に表示する方法を提案しています。

あなたはあなたの略語のすべてをリストすることができます

:ab<CR>

(挿入モードの省略形のみをリストabするにはiab、置換)

そして、あなたは同じ接頭辞を持つすべての略語をリストすることができます

:ab prefix<CR>

これは略語の補完ほど理想的ではありませんが、既存の略語のリストをすばやく作成するには良い方法です。

このソリューションをより効率的にするには、ファイルタイプに固有の略語を作成することをお勧めします。たとえば、この省略形はJavaバッファーでのみ役立ちます。

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

したがって、次のように定義することをお勧めします。

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

自動コマンド部分では、Javaバッファー内にいる場合にのみ略語を作成でき、<buffer>オプションを指定すると、このバッファーからのみ略語にアクセスできます。

この方法で:iabは、Javaバッファーにいる場合にのみ略語が表示されます。略語がたくさんある場合は、すべての略語を定義し、オートコマンドに関数を呼び出させるファイルタイプごとに関数を作成するのが面白いでしょう。何かのようなもの:

autocmd! FileType latex call CreateLatexAbbrev()

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

別の解決策は、キーワードのソースとして略語のリストを使用して、独自のオートコンプリート機能を作成することです。

最後に、私は「500を超える略語」にかなり感銘を受けていると言わざるを得ません。どの略語を使用しているかはわかりませんが、慣れていない場合はスニペットの概念を見てみるのも面白いでしょう。彼らと。これらはキーワードを入力してホットキーを押すことによってトリガーされるテンプレートであるため、省略形よりも柔軟性が高く、使用している省略形の数を減らすことができる場合があります。興味深い紹介については、こちらをご覧ください。


1

省略形をファイルタイプでグループ化してみませんか?

それらすべてを~/.vimrcファイルに含めるのではなく、それらを~/.vim分割して、ランタイムディレクトリの適切な場所に配置します。これは、Unixのようなオペレーティングシステム上にあります。

たとえば、Markdownの省略形はファイル~/.vim/after/ftplugin/markdown.vimにあり、Vim はMarkdownファイルタイププラグインのロードにこれをチェックます。

巨大な.vimrcファイルがあってはいけません。を使用すると、柔軟性が向上し$VIMRUNTIMEます。ランタイムパスはVimのヘルプシステムに記載されています:h 'runtimepath'

私は最初に、VimをテーマにしたアドベントカレンダーVimwaysの優れた記事.vimrcから.vimにこのことについて学びました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.