I am using counsel with projectile mainly for two use cases:

  • counsel-projectile-ag for project-wide grep
  • counsel-projectile-find-file to get a list of file names by typing some characters.

I usually have them bound to C-C C-sand C-C C-f, which used to work well with any other major modes.

Recently, I switched to using tree-sitter and set it up to use python-ts-mode. I also started using lsp-mode. Since then, whenever I open any python file, C-c C-s and C-c C-f are bound to the functions from python-mode. I’ve tried adding

(unbind-key "C-c C-s" python-ts-mode-map)
(unbind-key "C-c C-f" python-ts-mode-map)

to python-ts :config on use-package, and similar to python-mode, but I am still getting

python-ts-mode-map), which is an interactive native-compiled Lisp
function in ‘python.el’.

It is bound to C-c C-s.

(python-shell-send-string STRING &optional PROCESS MSG)

Send STRING to inferior Python PROCESS.
When optional argument MSG is non-nil, forces display of a
user-friendly message if there’s no process running; defaults to
t when called interactively.

[back]

What would be the correct way to set the configuration to get this always bound to the counsel-projectile commands whenever I open a python file?

Caveat: I am using NixOS home-manager to manage my emacs installation, which means that I am not manipulating my .emacs directly.

The relevant sections of my nix file.

usePackage = {
python-ts-mode = {
        enable = true;
        mode = [ ''("\\.py\\'" . python-ts-mode)'' ];
        hook = [
          "hs-minor-mode"
          "(python-ts-mode . python-isort-on-save-mode)"
        ];
        bind = {
          "C-c C-s" = "counsel-projectile-ag";
          "C-c C-f" = "counsel-projectile-find-file";
        };
        config = ''
        (unbind-key "C-c C-s" python-ts-mode-map)
        (unbind-key "C-c C-f" python-ts-mode-map)
        '';
      };

python-mode = {
        enable = true;
        bind = {
          "C-c C-s" = "counsel-projectile-ag";
          "C-c C-f" = "counsel-projectile-find-file";
        };
        config = ''
            (unbind-key "C-c C-s" python-mode-map)
            (unbind-key "C-c C-f" python-mode-map)
        '';
      };
lsp-mode = {
        enable = true;
        command = [ "lsp" ];
        hook = [
          "((python-ts-mode java-mode vue-mode javascript-ts-mode typescript-ts-mode) . lsp-deferred)"
        ];
        bind = {
          "C-c r r" = "lsp-rename";
          "C-c r f" = "lsp-format-buffer";
          "C-c r g" = "lsp-format-region";
          "C-c r a" = "lsp-execute-code-action";
          "C-c f r" = "lsp-find-references";
          "C-c C-s" = "counsel-projectile-ag";
          "C-c C-f" = "counsel-projectile-find-file";
        };
      };
counsel = {
        enable = true;
        bind = {
          "C-x C-d" = "counsel-dired-jump";
          "C-x C-r" = "counsel-recentf";
          "C-x C-y" = "counsel-yank-pop";
        };
        diminish = [ "counsel-mode" ];
      };

      counsel-projectile = {
        enable = true;
        bind = {
          "C-c C-s" = "counsel-projectile-ag";
          "C-c C-f" = "counsel-projectile-find-file";
        };
      };
};

Any help appreciated.