Плагины tmux, определенные с помощью nix, вызывают ошибки 127.

Вопрос или проблема

Обзор

Я пытаюсь настроить tmux с использованием nix и home-manager на macOS.

Однако всякий раз, когда я обновляю конфигурацию tmux, я получаю следующие ошибки:

'/nix/store/6iq9z3wnacxqhja3r93b7lsdl1kvcp11-tmuxplugin-sensible-unstable-2017-09-05/share/tmux-plugins/sensible/sensible.tmux' вернул 127                                                                                                                            [0/0]
'/nix/store/6iq9z3wnacxqhja3r93b7lsdl1kvcp11-tmuxplugin-sensible-unstable-2017-09-05/share/tmux-plugins/sensible/sensible.tmux' вернул 127
'/nix/store/8cqfwlqfxp21fwbcvl8dyyahdm4klmxj-tmuxplugin-catppuccin-unstable-2024-05-15/share/tmux-plugins/catppuccin/catppuccin.tmux' вернул 127
'/nix/store/87czlf8i2q2bzk1xikhx20d80g9kpdi9-tmuxplugin-resurrect-unstable-2022-05-01/share/tmux-plugins/resurrect/resurrect.tmux' вернул 127
'/nix/store/aqs7gq94wd4ldbbsnrrm232jifbywwjy-tmuxplugin-continuum-unstable-2022-01-25/share/tmux-plugins/continuum/continuum.tmux' вернул 127
'/nix/store/ixmqzdn5yck23fi1d824a04mvxkb7jk6-tmuxplugin-yank-unstable-2021-06-20/share/tmux-plugins/yank/yank.tmux' вернул 127

Отладка

Я посмотрел на сгенерированный файл tmux.conf и обнаружил, что в нем есть несколько команд run-shell, таких как следующая:

# ============================================= #
# Начать с настроек по умолчанию из плагина Sensible  #
# --------------------------------------------- #
run-shell /nix/store/6iq9z3wnacxqhja3r93b7lsdl1kvcp11-tmuxplugin-sensible-unstable-2017-09-05/share/tmux-plugins/sensible/sensible.tmux
# ============================================= #

Эти команды run-shell совпадают с программами, которые возвращают ошибки 127 в журналах tmux.

Согласно этому вопросу на GitHub, ошибки 127 означают, что программа не найдена. Однако, когда я явным образом пытаюсь запустить эти программы или вывести их с помощью cat, я вижу их.

Это говорит мне о том, что по какой-то причине я могу вручную запускать сгенерированные программы, но tmux не может.

Я нашел этот пост: функции оболочки tmux возвращают ошибку 127. Поэтому я также попытался запустить сгенерированные .tmux программы, используя /bin/sh, и смог успешно запустить их там.

Файлы

Вот вся моя конфигурация nix для tmux.

{ pkgs, ... }:
{
  programs.tmux = {
    enable = true;
    terminal = "tmux-256color";
    historyLimit = 100000;
    shell = "${pkgs.zsh}/bin/zsh";
    plugins = with pkgs;
      [
        tmuxPlugins.sensible
        {
          plugin = tmuxPlugins.catppuccin;
          extraConfig = ''
            set-option -sa terminal-features "screen-256color,:RGB"
            set -g @catppuccin_flavour 'mocha'
            set -g @catppuccin_status_modules_right "session"
            set -g @catppuccin_status_modules_left " "
            set -g @catppuccin_status_fill "icon"
            set -g @catppuccin_window_number_position "right"
            set -g @catppuccin_window_left_separator ""
            set -g @catppuccin_window_right_separator " "
            set -g @catppuccin_window_middle_separator " █"
            set -g @catppuccin_window_number_position "right"
            set -g @catppuccin_window_default_fill "none"
            set -g @catppuccin_window_default_text "#W"
            set -g @catppuccin_window_current_fill "number"
            set -g @catppuccin_window_current_text "#W"
            set -g @catppuccin_pane_active_border_style "fg=#313244"
            set -g status-bg "#11111b" # также дублируется внизу файла
          '';
        }
        {
          plugin = tmuxPlugins.resurrect;
          extraConfig = ''
            set -g @resurrect-strategy-nvim 'session'
            set -g @resurrect-capture-pane-contents 'on'
          '';
        }
        {
          plugin = tmuxPlugins.continuum;
          extraConfig = ''
            set -g @continuum-restore 'on'
            set -g @continuum-boot 'on'
            set -g @continuum-boot-options 'alacritty,fullscreen'
            set -g @continuum-save-interval '5' # сохранять каждые 5 минут
          '';
        }
        tmuxPlugins.yank
      ];
    extraConfig = ''
      #
      # Горячие клавиши
      #

      # установить префикс на control-a
      set -g prefix C-a
      unbind C-b
      bind-key C-a send-prefix

      # использовать \ для создания горизонтальных панелей
      unbind %
      bind '\' split-window -h

      # использовать - для разделения окна горизонтально
      unbind '"'
      bind - split-window -v

      # изменять размер панелей
      bind -r j resize-pane -D 5
      bind -r k resize-pane -U 5
      bind -r l resize-pane -R 5
      bind -r h resize-pane -L 5

      # Умное переключение панелей с учетом разделений Vim.
      # См.: https://github.com/christoomey/vim-tmux-navigator
      is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
          | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?|fzf)(diff)?$'"
      bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h'  'select-pane -L'
      bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j'  'select-pane -D'
      bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k'  'select-pane -U'
      bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l'  'select-pane -R'
      tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
      if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
          "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\'  'select-pane -l'"
      if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
          "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\'  'select-pane -l'"

      bind-key -T copy-mode-vi 'C-h' select-pane -L
      bind-key -T copy-mode-vi 'C-j' select-pane -D
      bind-key -T copy-mode-vi 'C-k' select-pane -U
      bind-key -T copy-mode-vi 'C-l' select-pane -R
      bind-key -T copy-mode-vi 'C-\' select-pane -l

      # установить визуальное оформление
      set-option -sa terminal-features "screen-256color,:RGB"
      set-option -g status-position top

      # легко обновлять конфигурацию tmux
      unbind r
      bind r source-file ~/.config/tmux/tmux.conf

      set -g status-bg "#11111b"
    '';
  };
}

Ответ или решение

Ошибка с кодом 127 в Tmux, возникающая на MacOS при использовании плагинов, управляемых через Nix и Home-manager, часто связана с тем, что Tmux не может найти или запустить скрипты соответствующих плагинов. Вот несколько шагов, которые помогут вам диагностировать и решить эту проблему.

Шаг 1: Убедитесь, что плагины установлены правильно

По вашему описанию видно, что Tmux не может выполнить файлы .tmux плагинов, находящиеся по пути /nix/store/.... Убедитесь, что эти файлы существуют и имеют правильные разрешения. Вы можете использовать команду:

ls -l /nix/store/6iq9z3wnacxqhja3r93b7lsdl1kvcp11-tmuxplugin-sensible-unstable-2017-09-05/share/tmux-plugins/sensible/sensible.tmux

Это покажет размер файла и разрешения доступа. Выбирайте файлы, у которых установлены разрешения на чтение.

Шаг 2: Проверьте путь к Tmux

Tmux может не правильно обрабатывать $PATH, когда вы запускаете скрипты. Добавьте следующую строку в ваш конфигурационный файл Tmux, чтобы явно указать путь:

set-option -g default-shell /bin/zsh

Убедитесь, что ваша оболочка (в данном случае Zsh) правильно настроена и включена в переменную окружения $PATH.

Шаг 3: Определите зависимости плагинов

Убедитесь, что все зависимости для получения и выполнения плагинов установлены через Nix. Некоторые плагины могут требовать специфические утилиты или зависимости, которые могут быть не установлены.

Шаг 4: Обновление конфигурации Nix

Возможно, некоторые плагины устарели или имеют ошибки. Убедитесь, что у вас последняя версия ваших пакетов Nix. Запустите следующую команду для обновления:

nix-channel --update && nix-env -u '*'

Шаг 5: Перезапустите tmux

После внесения изменений в конфигурацию, полностью перезапустите Tmux. Для этого выполните:

tmux kill-server

Затем снова запустите Tmux.

Шаг 6: Проверка выводов и сообщений об ошибках

Если ошибка всё ещё возникает, попробуйте проверить вывод с помощью следующей команды:

tmux source-file ~/.config/tmux/tmux.conf

Обратите внимание, если появляются ошибки. Если они все еще связаны с кодом 127, можно попробовать выводить для диагностики:

set -g @plugin_action 'echo "Loading plugin..."'

Это может дать представление о том, какой именно плагин вызывает ошибку.

Шаг 7: Отладка с помощью окружения

Попробуйте запустить Tmux в отладочном режиме, чтобы получить больше информации о происходящем:

tmux -vv new-session

Эта команда создаст файлы логов, которые помогут вам понять, что именно происходит во время запуска Tmux.

Заключение

Если после выполнения всех этих шагов ошибка с кодом 127 сохраняется, возможно, следует обратиться за помощью на форумы или GitHub-репозитории плагинов, предоставив детали вашей конфигурации и возникших ошибок. Надеюсь, эти шаги решат вашу проблему с Tmux и Nix.

Оцените материал
Добавить комментарий

Капча загружается...