Как выбрать между nil и 0 или t и 1 при установке переменных или включении режимов


19

Я понимаю , что nil, 0и / или -1используются для отключения некоторых функций и t, 1и / или +1используются для включения некоторых функций. Какой выбор выбрать при назначении переменных или включении / отключении второстепенных режимов?

Я видел все эти варианты, используемые в той или иной точке. Это заставляет меня задуматься, а есть ли разница между ними? Я видел, что иногда использование 0не работает для меня, а nilделает. Есть ли различия в том, где они используются?


1
Я переписал вопрос, чтобы более четко указать, что, по-моему, вы спрашиваете. Не стесняйтесь отменить редактирование, если я ошибаюсь.
Ниспио

@nispio Ваши правки в порядке. Большое спасибо. :)
greduan

Ответы:


17

TL; DR

Прежде чем устанавливать какую-либо переменную, вы должны знать, как эта переменная должна интерпретироваться. Точно так же, прежде чем вызывать какую-либо функцию (включая те, которые используются для переключения второстепенных режимов), вы должны знать, как интерпретируются аргументы этой функции.

Используйте C-hfи C-hvдля просмотра документации по рассматриваемой функции или переменной. Следует указать ожидаемые значения.

«Не ноль» означает буквально все, что не является nil. Это включает 0и отрицательные числа.


Незначительные режимы

Давайте возьмем конкретный пример. Введите C-hfblink-cursor-mode и нажмите, RETчтобы увидеть документацию по функциям для blink-cursor-mode:

(режим мигания курсора и необязательный ARG)

Переключатель курсора мигает (режим Blink Cursor). С префиксным аргументом ARG, включите режим Blink Cursor, если ARG положительный, и отключите его в противном случае. Если вызывается из Lisp, включите режим, если ARG опущен или ноль.

Мы можем включить режим Blink Cursor любым из следующих способов:

(blink-cursor-mode)           ; Omitted argument
(blink-cursor-mode 1)         ; Positive argument
(blink-cursor-mode t)         ; True argument
(blink-cursor-mode nil)       ; nil argument (don't use this)

Обратите внимание, что аргумент tбудет работать, хотя в строке документа это не упоминается. Хотя это часто имеет место, ваша самая безопасная ставка - использовать то, что подсказывает вам строка документа, что в данном случае является положительным значением.

Также обратите внимание, что аргумент nilбудет работать. Я настоятельно рекомендую против nilэтого, потому что это делает ваше намерение неясным. Если бы я просматривал ваш код lisp и увидел nilаргумент, я бы предположил, что вы хотите отключить второстепенный режим.

Мы также можем отключить blink-cursor-modeследующими способами:

(blink-cursor-mode 0)         ; Non-positive argument
(blink-cursor-mode -1)        ; Negative argument

Еще раз обратите внимание, что nilэто не один из способов отключить этот второстепенный режим. Это верно почти для любого второстепенного режима, с которым вы столкнетесь.


переменные

Теперь давайте посмотрим на пример переменной. Введите C-hvtruncate-linesи нажмите, RETчтобы посмотреть документацию для переменной truncate-lines:

truncate-lines - это переменная, определенная в `C исходном коде '.

Значения, отличные от нуля, не отображают строки продолжения. Вместо этого, дайте каждой строке текста только одну строку экрана.

Вы можете включить усечение любым из следующих способов:

(setq truncate-lines t)       ; Boolean true value (non-nil)
(setq truncate-lines 1)       ; Positive value (non-nil)
(setq truncate-lines 0)       ; Zero value (non-nil)
(setq truncate-lines -1)      ; Negative value (non-nil)

Это может удивить вас, что 0и -1будет работать. Опять же, я бы рекомендовал не использовать их, потому что это делает ваши намерения неясными.

Единственный способ отключить усечение - это

(setq truncate-lines nil)     ; nil value

Другими словами, вы можете установить значение, truncate-linesравное числам, буквам, строкам, спискам или чему-либо еще, если вы этого не захотите, если только оно не будет оцениваться nil, включит усечение. (Но вы должны действительно придерживаться tили 1).


Это ответило на мой вопрос. Спасибо. :)
greduan

0

Это все разные вещи. 0, 1 и -1 - разные числа; nilэто символ

Каждый из них используется повсюду, для разных вещей. Чтобы узнать, для чего каждый из них используется в определенном контексте , обратитесь к документу для этого контекста . И это включает в себя контексты включения или выключения разных режимов, включения и выключения разных вещей с использованием переменных и множество других контекстов.

В сумме:

  • Ваш вопрос слишком широк, чтобы быть полезным.
  • Вам нужно обратиться к документу: (a) в общем, чтобы немного узнать о Emacs Lisp, и (b) в конкретных контекстах (например, документ для определенного режима).

Документ для данного режима обычно говорит вам, как включить и выключить его. Если он говорит вам использовать 1 или -1 или nilне nilдля чего-то, то это то, что это значит. Существует несколько общих правил включения и выключения режимов (в интерактивном режиме и из кода на Лиспе). Но, похоже, вам действительно нужно начать с получения общего фона.

Обратитесь к документу Emacs, чтобы узнать, как запрашивать помощь и другую информацию у самого Emacs : как проверить значение переменной, как просмотреть документ по переменной или функции (включая функцию, которая включает / выключает режим) , и так далее.

Вы можете начать с использования C-h C-h ( Ctrl-h Ctrl-h), чтобы узнать о справочной системе Emacs. И строить оттуда.

C-h rпомещает вас в руководство по Emacs. Попробуйте учебник Emacs: C-h t. И проверьте страницу Emacs Wiki Newbie и страницу о LearningEmacs .

Чтобы начать изучать Emacs Lisp:, C-h iвыберите руководство по имени Emacs Lisp Introи начните чтение. И проверьте страницу Emacs Wiki об изучении Emacs Lisp .


1
Спасибо за Ваш ответ. :) Наверное, я спрашивал о том, в каких контекстах они используются. Должно было сделать это более понятным. Спасибо. :) Я знаю об основных различиях между символами, например, как nilлогический эквивалент ложных и tистинных, а остальные просто цифры. Но я не был уверен в том, в каких контекстах они обычно использовались.
greduan

Посмотрите, что я написал об общей информации о режимах (ссылка на руководство). Несмотря на такую ​​общую информацию, вы всегда должны начинать с проверки документации для конкретного интересующего вас режима. Он скажет вам, что использовать для его включения или выключения. Если это не так, то применимо общее поведение, описанное в руководстве, но начните с конкретного режима doc . Дело не в разнице между этими вещами самих по себе. Дело в различиях в том, как они используются в определенных контекстах. Для этого начните с вопроса контекста.
Дрю

1
OK. Большое спасибо. :) Круто, что Emacs получил свой собственный сайт SE, а?
greduan

1
PS Не волнуйся. Я уверен, что другие расскажут о некоторых общих правилах . ;-) Я предпочитаю (а) попросить вас проконсультироваться с документом об этом, потому что он был написан только с учетом этого обучения, и (б) заставить вас начать с того, что всегда спрашивает конкретный режим о себе. Общие правила не влияют на особенности режима, и если вы проигнорируете последнее, то пропустите что-то.
Дрю

Будет круто, когда SE получит свой собственный режим Emacs. ;-)
Дрю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.