Vim:letとsetの違いは何ですか?


144

違いは何だletsetvimのエディタでは?

私はいつもそれらの両方がなぜ存在するのか疑問に思っていましたか?

また、その歴史的背景も聞きたいです。


15
あなたがしようとしました:help set:help let、マニュアルを読みますか?
hochl

5
はい、そうしましたが、セットが存在しなければならない理由はまだわかりません。これは、同じことを行うためです。
Dave Halter、

1
@DavidHalter:let同じことはしません。そこにあなたが達成することができないものですsetと可能であることはlet、私の答えを参照してください。
ルネNyffenegger

4
setlocalまだ誰も言及していません...それらは&l:*変数と同等です。
Chris Morgan

1
@VictorZamanian:ブール値の設定の場合は、set noicまたはの方が間違いなく簡単set icです。私の知る限りでは、setもとの互換性があるviこれlet私が想定して、ではありません。
ルネNyffenegger

回答:


143

:set設定するためのものであるオプションを:letに値を割り当てるための変数

オプションの値が、aが前に付加されたオプションの名前にリンクされている場合があります&(その場合、&option-name構成は「通常の」変数と非常によく似た動作をします)。したがって、以下は同等です。

:set  tw=40
:let &tw=40

ただし、たとえば、グローバル変数foo(:let g:foo=50)に50を割り当てることは、:setコマンドでは実行できません(g:fooは変数であり、オプションではないため)。

一部のオプションはブール型です。これらを設定する場合、値は必要ありません(:set noicとその逆:set ic)。


22

セットはオプションに特化した、よりユーザーフレンドリーなインターフェースです

例えば

:verbose set

有効なすべてのオプションを表示します。

:set tw=40

の省略形として機能します set textwidth=40

:set wrap&

オプションのデフォルト値を設定しますwrap

:set nowrap

オプションの設定を解除します

:set wrap!

ウィル切り替えるオプションを

最も重要なこと、

:setTab #タブ補完を取得します!

上記のいくつかは、(簡単に)で達成できletます。


re::set nowrap、options.txt(:help set-option)と言う::se [t] {option}トグルオプション:設定し、それをオンにします。数値オプション:値を表示します。文字列オプション:値を表示します。これは、「オプションラップのデフォルト値を設定します」と言ったときに、ここにあるものと一致しません。??
楕円形ビュー

@Ellipticalview私は少し混乱しています。ドキュメントの一部を引用しています。あなたが全部を読むと、それは私のすべてのケースに同意することがわかります。[注:no-prefixedオプションは混乱する可能性があります。またoption&&見逃した可能性のある末尾があることに注意してください。]
sehe

12

:setオプションでのみ機能し、seheの回答はいくつかの良い使用例を示しています。

:let一方、できることのほとんどすべて:setに加えて、それ以上のことができます。値を割り当てることができます

  • 変数、例えば let vi = 'vim'
  • オプション、例えば let &tw = 40
  • レジスタ、例えば let @a = $HOME . '/vimfiles'
  • 環境変数、例えば let $NOTHING = 'NOTHING'

もう1つの大きな違いは、の右側:letであることです。つまり、上記のレジスタの例にあるように、文字列連結や算術演算(などlet &tw = 40 + 60)を実行できます。これは、文字列の場合は値を引用する必要があることも意味します。:set一方、値を逐語的に読み取ります。

ほとんどのことを実行でき:setますが、オプションを使用する方が簡単です:let。以下は、seheの例を使用した比較です( "n / a"は、これを使用する方法がないことを意味します:let)。

  • :verbose set vs n / a(すべてのオプションをリストする別の方法があるとは思わない)
  • :set tw=40vs :let &tw = 40(はい、同じ省略形を使用することもできますlet
  • :set wrap& vs n / a
  • :set nowrapvs :let &wrap = 0(ブールオプションの場合、0はfalse、1はtrueです)
  • :set wrap!:let &wrap = !&wrap

さらにいくつかの例

  • オプションの値を出力します::set formatoptions?vs :echo &formatoptions(とletは異なり、値を出力しませんset
  • 同時に複数のオプションに割り当てる:

    :set et sw=4 sts=4 
    

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • グローバルオプションを設定:setglobal etvslet &g:et = 1

  • ローカルオプションを設定:setlocal etvslet &l:et = 1

詳細を参照:h :set:h :letてください


tl; dr

:setオプションでのみ機能しますが、構文ははるかに単純です。:letオプションだけでなく、変数、レジスタ、環境変数でも機能します。とは異なり:set、の右側:letは式です。


10

人々が書いたことを拡張する:letと、変数の値をオプションに割り当てるために使用できることに気づきました:set。何かはできません。たとえば、この機能は使用してletグローバル変数に値を代入するorig_twにはtextwidthオプション:

" Toggle Autowrap
" Default of 72 but can be overridden by tw settings in other vimrc files
let g:orig_tw = 72
function Toggle_autowrap_mode()
    if &textwidth == 0
        " Must use let instead of set here in order for g:orig_tw to be
        " evaluated properly
        let &textwidth = g:orig_tw
        echo "Autowrap mode on tw=" . &textwidth
    else
        let g:orig_tw = &textwidth
        set textwidth=0
        echo "Autowrap mode off tw=" . &textwidth
    endif
endfunction

noremap _A :call Toggle_autowrap_mode()<CR>

概要: let変数をオプションに割り当てることができます:let &textwidth = g:orig_tw逆も同様です。
Serge Stroobandt 2014年

2

とても簡単です。
人々が言っ​​たようsetにオプションのためであり、制限のためによりよく働きます。またset、すべてのバージョンのviオプションを設定するために使用する歴史的なコマンドです。ほとんど(すべて?)の他のバージョンにはviはありませんlet

しかし、おそらく最も重要なのはということですsetが、すべてのバージョンの作品vimletコンパイル時にコマンドを省略することができますvim。標準tinysmallビルドがこれを行います。

それがないlet場合はエラーが発生します:
E319: Sorry, the command is not available in this version

注:ifおよびendifも実装されていませんvim.tinyが、この場合、コマンドはエラーを生成せず、2つのコマンド間のすべてがスキップされますelse

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